powershell - 将变量传递给powershell中的子进程
问题描述
是否可以将所有 env 变量传递到一个新的 powershell 窗口,如下所示:
$var=10; Start-Process powershell '-command "echo $var; Start-Sleep -s 5; "'
这不会在子窗口上显示任何内容。
如果不可能拥有所有变量,如何传递其中的一些?
这个变量 (var) 与 env 变量不同吗?
解决方案
变量与环境变量不同。在 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。有办法让他们说话,但那是另一天的事情了。
推荐阅读
- blockchain - Parity-ethereum 和 --pruning 如何快速处理古老的快照?
- javascript - 从 JSON 数据中获取特定值
- database - nodejs修改mongodb中的字符串
- node.js - 如何使用 arrayFilters 更新数组中的元素
- php - PHP - 在构建 [Spatie\Cors\Cors] 时不可实例化
- ios - PageviewController 问题中的水平滚动
- java - 这是 Java regexp 实现中的错误吗?
- objective-c - 禁用转换 NSString
- styled-components - 使用 props 基于其他组件创建样式化组件
- jakarta-ee - ServletOutputStream 将额外的字节写入响应