如何使用启动过程在会话中使用本地PowerShell变量?

时间:2018-07-12 22:37:37

标签: powershell

我有一个本地字符串变量,其中包含要在PS脚本中早期定义和设置的文件路径,然后在Start-Process调用的命令块中重用。我已经尝试过:

Start-Process Powershell { Set-Location $FlatScriptFolder ; .\BH-Corporate-Flats-Make-Assets.ps1 ; Read-Host}

该特定行在脚本运行时会导致错误:

Set-Location : Cannot process argument because the value of argument "path" is null. Change the value of argument
"path" to a non-null value.
At line:1 char:1
+ Set-Location $FlatScriptFolder ; .\BH-Corporate-Flats-Make-Serve.ps1  ...

我收集到的问题是可变范围。我的变量是本地变量,(远程)会话看不到它。我发现this blog post可以很好地说明问题,但我不了解该解决方案在我的情况下如何工作。老实说,我在研究此特定问题时遇到了麻烦,因此希望这里有人可以提供帮助?

这是我尝试过的另外两件事:

Start-Process Powershell { param ($FlatScriptFolder) Set-Location $FlatScriptFolder ; .\BH-Corporate-Flats-Make-Assets.ps1 ; Read-Host}

$Script1Command = { Set-Location $FlatScriptFolder ; .\BH-Corporate-Flats-Make-Serve.ps1 ; Read-Host}
Start-Process Powershell -ArgumentList ($Script1Command)

当我尝试以上任何一种方法时,都会得到完全相同的错误消息。

1 个答案:

答案 0 :(得分:2)

当您使用powershell.exe [1] 时,不能直接将脚本块 传递给Start-Process ,但您可以传递一个字符串表示形式,然后要求您在其前面加上呼叫操作符&

此外,为了合并来自调用者的上下文的变量值,您需要将它们作为 arguments 传递(第1个参数可以作为{{1}访问) }):

$Args[0]

请注意-不幸的是-需要将参数的值包含在双重转义嵌入的Start-Process powershell.exe '-Command', '&', '{ Set-Location $Args[0]; .\BH-Corporate-Flats-Make-Assets.ps1; Read-Host }', "\`"$FlatScriptFolder\`"" 中,这是正确传递带有嵌入空格的值所必需的-请参见{{3 }}。

注意:"...",即对嵌入的引号使用-引号原则上可行,但前提是指定的值恰好不包含任何"'$FlatScriptFolder'"实例本身。 '所需的双转义源自(a)满足PowerShell的 immediate 语法要求,即在双引号(")中使用 additionally < / em>需要`"进行转义,以使Powershell的 CLI 能够识别它们。


或者,您可以在调用者的上下文中使用字符串扩展(插值)扩展来将局部变量“烘焙”到命令字符串中以传递到新的PowerShell实例

  • 由于您随后没有传递任何自变量,因此无需传递{string}脚本块,而该字符串必须以\运算符开头-您只需传递语句列表按原样。

  • 需要说明的是,将调用者上下文中要执行的操作与被调用者最终要执行的操作区分开可能会比较棘手(您需要&-转义`实例来引用到 callee's 上下文中的变量/表达式)。

$

最后,如果您要做的只是为新流程 设置工作目录 ,则只需使用 Start-Process powershell.exe '-Command', "Set-Location \`"$FlatScriptFolder\`"; .\BH-Corporate-Flats-Make-Assets.ps1 ; Read-Host" 参数

-WorkingDirectory

[1] Start-Process -WorkingDirectory $FlatScriptFolder powershell.exe '-Command', '.\BH-Corporate-Flats-Make-Assets.ps1; Read-Host' 之后的参数隐式传递给powershell.exe'的第二个位置参数,
Start-Process,其类型为-ArgumentList。因此,任何非字符串类型在调用时都会转换为[string[]]。如果您将脚本块([string])转换为字符串,则将传递文字内容-不包含封闭的{...}{;简而言之:传递}与传递{...}相同,无论'...'代表什么,目标...实例将 not 视为脚本块。