c:\test.ps1存在并且是一个空文件。
Start-Process -filepath powershell -argumentlist { -noexit -file "c:test.ps1" }
打开一个新的powershell窗口并保持其打开状态(这正是我想要的(。
$a = "c:test.ps1"
Start-Process -filepath powershell -argumentlist { -noexit -file "$a" }
短暂闪烁一个新的Powershell窗口,然后立即关闭它。我想知道为什么?
tl;dr
将传递参数传递给Start-Process
的-ArgumentList
(-Args
(参数:
-
不要使用脚本块(
{ ... }
(。 -
请使用单个可扩展字符串(
"..."
(:
$a = "c:test.ps1"
Start-Process powershell "-noexit -file `"$a`""
注意:参数名称-FilePath
和-ArgumentList
在此命令中是位置隐含的;也就是说,该命令等效于Start-Process -FilePath powershell -ArgumentList "-noexit -file `"$a`""
至于您尝试了什么:
Start-Process
的-ArgumentList
(-Args
(参数是[string[]]
类型的,即它希望将字符串参数的数组传递给正在启动的外部程序,因为在将参数传递给外部程序时,字符串是唯一受支持的数据类型。
- 注意:虽然将传递参数单独传递,作为数组的元素,传递到
-ArgumentList
(-ArgumentList '-noexit', '-file', $a
(在概念上是最好的方法,但不幸的是,由于Start-Process
中的一个长期错误,这是不明智的,该错误在撰写本文(7.2版(时仍然存在-请参阅GitHub问题#5576。
目前,使用包含所有参数的单个字符串,每个包含在嵌入式"..."
中,必要时引用(如上所示(,是唯一稳健的方法
正如链接的GitHub问题中所讨论的,未来可能会引入一个支持健壮的基于数组的参数传递的-ArgumentArray
参数
当您传递脚本块({ ... }
(时,它是字符串化的(它的.ToString()
方法被隐式调用,脚本块的字符串化是它的逐字内容,不包括封闭的{
和}
(,这意味着不会进行扩展(字符串插值(
例如,尝试{ $HOME }.ToString()
。
- 注意:当您直接同步(而不是通过
Start-Process
(调用powershell.exe
时,可以使用脚本块,但只能从PowerShell调用,并且此类脚本块由被调用者执行,因此也不能查看调用者的变量;但是,您可以将参数传递给它们;例如:powershell { "args passed: $args" } -args 1, 2