首页 > 解决方案 > 将变量传递给powershell中的子进程

问题描述

是否可以将所有 env 变量传递到一个新的 powershell 窗口,如下所示:

$var=10; Start-Process powershell '-command "echo $var; Start-Sleep -s 5; "'

这不会在子窗口上显示任何内容。

如果不可能拥有所有变量,如何传递其中的一些?

这个变量 (var) 与 env 变量不同吗?

标签: powershellpowershell-5.1

解决方案


变量与环境变量不同。在 PowerShell 中,使用 $ENV 访问环境变量,例如 $ENV:COMPUTERNAME 或 $ENV:logonserver。

前任。启动进程 Powershell "ECHO $ENV:COMPUTERNAME;Pause"

由于这些值是在调用时从操作系统中提取的,因此它们始终可用并且不依赖于您的 PowerShell 环境。

变量 $var 是会话范围的变量,仅在当前 PS 进程中有效。在您的情况下,不会在屏幕上打印任何内容,因为该变量在新的 PowerShell 进程中不存在。

使您提供的示例正常工作的最简单方法是修改引号以允许 PowerShell 替换字符串中的变量。这基本上将文字值传递给进程,而不是要求它评估它一无所知的变量。

试试这个,Start-Process PowerShell "-command Echo $var; start-sleep -s 5" 传递给子进程的是:-command echo 10; start-sleep -s 5 $var 在开始进程的调用开始之前被替换。

如果您的目标是在其他进程中定义变量,那么最好的方法是使用脚本块。脚本块中的所有内容都在远程进程中执行。可以定义变量,函数,几乎任何你可以在本地做的事情,你都可以在子进程中做。脚本块定义要在其他进程中执行的代码,并且可以被称为任何东西。在下面的示例中,我故意避免将其称为 $ScriptBlock 来演示这一点。典型的命名约定是只命名变量 $ScriptBlock。

示例:我将放弃 ECHO 并使用 Write-Host。在这个例子中,任何一个都可以工作。此外,让我们传递 -NoExit 参数以保持窗口打开而不是休眠。要将多个参数传递给 PowerShell,我们将使用 -ArgumentList 参数。

$ScriptBlockExample = {$var = 10; Write-Host "This is my value" $var;}
Start-Process PowerShell -ArgumentList "-NoExit $scriptBlockExample"

这将打开一个新的 PS 窗口并执行脚本块的内容。命令完成后,在新窗口中键入 $var,您将收到值 10。这是因为变量是在新进程中定义的。

诀窍是要了解默认情况下,这两个进程不相互通信。如果您在父进程窗口中定义了 $var,它将完全独立于第二个进程中的 $var。有办法让他们说话,但那是另一天的事情了。


推荐阅读