如何在批处理内嵌的PowerShell脚本中获取批处理文件路径
在嵌入PowerShell的批处理中传递并获取批处理文件路径
核心思路
你当前的批处理是通过Start-Process以管理员身份启动新的PowerShell进程,要传递批处理路径,只需将%~f0(批处理完整路径)作为参数传入新PowerShell进程,再在嵌入的脚本中接收即可。
修改后的完整代码示例
# 2>NUL & @CLS & PUSHD "%~dp0" & powershell -COMMAND "Start-Process powershell -Verb RunAs -ArgumentList '-windowstyle hidden -nol -nop -ep bypass ""& { $batPath = $args[0]; [IO.File]::ReadAllText($batPath) | Select-Object -Skip 1 | iex }""', '%~f0'" # 这里开始写你的PowerShell脚本,$batPath就是批处理文件的完整路径 Write-Host "批处理文件路径:$batPath" # 其他PowerShell逻辑...
关键细节解释
- 参数传递:在
Start-Process的ArgumentList末尾添加'%~f0',将批处理的完整路径作为参数传给新启动的PowerShell进程。 - 参数接收与脚本执行:用
$args[0]接收传递的路径,再读取批处理文件内容并跳过第一行(启动命令行),最后执行剩余的PowerShell代码。Select-Object -Skip 1是为了避免重复执行批处理的启动逻辑,如果你的批处理启动命令有多行,需调整Skip的数值。 - 引号转义:批处理嵌套PowerShell命令时,双引号需要用
""转义,确保参数能正确传递。
更清晰的参数定义方式(可选)
如果想让参数更易读,可以用param显式定义参数:
# 2>NUL & @CLS & PUSHD "%~dp0" & powershell -COMMAND "Start-Process powershell -Verb RunAs -ArgumentList '-windowstyle hidden -nol -nop -ep bypass ""& { param($batPath); [IO.File]::ReadAllText($batPath) | Select-Object -Skip 1 | iex }""', '%~f0'" # PowerShell脚本部分 Write-Host "批处理文件路径:$batPath" # 其他代码...
内容的提问来源于stack exchange,提问作者NqHai
相关产品推荐
相关产品推荐

