Powershell:使用文件变量启动进程



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

最新更新