gpt4 book ai didi

powershell - 如何使用启动过程在 session 中使用本地PowerShell变量?

转载 作者:行者123 更新时间:2023-12-02 23:37:38 24 4
gpt4 key购买 nike

我有一个本地字符串变量,包含要在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 ...

我收集到的问题是可变范围。我的变量是本地变量,(远程) session 看不到它。我发现 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)

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

最佳答案

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

另外,为了合并来自调用者上下文的变量值,您需要将它们作为参数传递(可以通过$Args[0]访问其第1个参数):

Start-Process powershell.exe '-Command', '&',
'{ Set-Location $Args[0]; .\BH-Corporate-Flats-Make-Assets.ps1; Read-Host }',
"\`"$FlatScriptFolder\`""

注意-不幸的是-需要将参数的值括在双转义的嵌入式 "..."中,这对于正确传递带有嵌入式空格的值是必需的-请参见 this GitHub issue

注意: "'$FlatScriptFolder'",即对嵌入的引号使用单引号原则上有效,但前提是指定的值恰好不包含 '实例本身。 "所需的双转义源自(a)满足PowerShell的即时语法要求,即在双引号字符串( `")中嵌入双引号,另外还需要 \-对其进行转义以供Powershell的CLI识别。

或者,您可以 在调用者的上下文中使用字符串扩展(插值)扩展,以将局部变量“烘焙”到命令字符串中,以传递给新的PowerShell实例:
  • 由于您随后将不传递任何参数,因此无需传递&运算符前面的(字符串化)脚本块-您可以按原样传递语句列表。
  • 需要注意的是,将调用者的上下文中要执行的操作与被调用者最终要执行的操作区分开可能会比较棘手(您需要` -escape $实例,该实例引用被调用者的上下文中的变量/表达式)。

  • Start-Process powershell.exe '-Command', 
    "Set-Location \`"$FlatScriptFolder\`"; .\BH-Corporate-Flats-Make-Assets.ps1 ; Read-Host"

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

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

    关于powershell - 如何使用启动过程在 session 中使用本地PowerShell变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315395/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com