我想从批处理文件启动 powershell 脚本,并确保该脚本在批处理文件继续下一步之前关闭。我一直无法弄清楚如何使用参数启动脚本。
以下命令在直接 PowerShell 中运行时有效:
Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"C:\my file path\myscript.ps1`" -fruit banana -car toyota"
但是我需要能够从批处理文件(CMD)运行它。下面的不起作用。 似乎是引用的问题,但不幸的是单引号被忽略了。
powershell -Command "Start-Process powershell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File `"C:\my file path\myscript.ps1`" -fruit banana -car toyota' -Wait"
为什么这不起作用以及为什么单引号不起作用?
您在这里问的问题是一个非常常见且重复的问题,这意味着我可以回答这个确实有效的特定命令行,但我宁愿给您一些可以使用的句柄。
在此答案的调用示例中,我使用以下
C:\my file path\myscript.ps1
:
Param($Fruit, $Car)
Write-Host 'Fruit:' $Fruit
Write-Host 'Car:' $Car
$Null = Read-Host 'Press <enter> to continue'
在很多情况下,在这样的情况下,嵌入了太多的 shell 和进程,这增加了这个问题的复杂性,成本高昂。正如您的示例中所示,没有理由使用
Start-Process
来“确保脚本在批处理文件继续下一步之前关闭”。 PowerShell 的点采购功能允许您使用更简单且更便宜的命令来调用脚本:
. 'C:\my file path\myscript.ps1' -fruit banana -car toyota
点源命令也同步运行。与
Start-Process
的区别
不过,它们在调用者的相同作用域中运行(请参阅:关于作用域),但是当从 CLI(命令行界面)调用单个脚本作为 PowerShell.exe
或 CMD.exe
时,这不应该成为问题。
这意味着如果您想从 [
powershell.exe
] 调用脚本,您可以这样做:
PowerShell -NoProfile -Command { . 'C:\my file path\myscript.ps1' -fruit banana -car toyota }
请注意,
PowerShell
命令行为您提供了额外的可能性来分隔脚本,即使用大括号({ ... }
)而不是在新字符串中嵌入命令(可能已经包含引号)。
此外,如果您想从 powershell.exe
命令行界面调用您的脚本,您也可以直接调用您的脚本:
PowerShell -NoProfile -File 'C:\my file path\myscript.ps1' -fruit banana -car toyota
我可能失去了所有的乐趣,最后一个命令行也应该在
CMD
命令行中工作,但我们假设您希望将 cmdlet 用作 Start-Process
,并带有需要引用为的参数在你的例子中:-File "C:\my file path\myscript.ps1"
。CMD
吃双引号
它只是使用双引号来分隔参数,但在确定参数时双引号被删除(顺便说一句。它不理解大括号)。CMD
CLI):
PowerShell -Command ". 'C:\my file path\myscript.ps1' -fruit ba"na"na -car toyota"
Fruit: banana
Car: toyota
因此,解决这个问题的最简单方法就是避免使用双引号,并在 CMD 命令行中的 PowerShell 部分使用单引号 (`'...``):
PowerShell -Command ". 'C:\my file path\myscript.ps1' -fruit banana -car toyota"
如果确实需要传递双引号,您需要使用更多双引号对其进行转义,如下所述:在参数中转义双引号:
PowerShell ". 'C:\my file path\myscript.ps1' -fruit 'ba"""na"""na' -car toyota"