【问题标题】:Environment variable, PowerShell session vs. started from CMD环境变量,PowerShell 会话与从 CMD 开始
【发布时间】:2017-06-29 13:59:07
【问题描述】:

我正在尝试从命令提示符窗口(以管理员身份运行)中运行 PowerShell 命令,但它失败了。而当我在 PowerShell 窗口中运行相同的命令时,它运行良好。

这是 PowerShell 窗口中没有错误的命令:

Powershell [Environment]::SetEnvironmentVariable("HostIPv4", "192.168.255.14:", "Machine")

在命令提示符窗口中失败:

C:\test>powershell [Environment]::SetEnvironmentVariable("HostIPv4", "192.168.255.14:", "Machine")
At line:1 char:39
+ [Environment]::SetEnvironmentVariable(HostIPv4, 192.168.255.14:, Mach ...
+                                       ~
Missing ')' in method call.
At line:1 char:39
+ [Environment]::SetEnvironmentVariable(HostIPv4, 192.168.255.14:, Mach ...
+                                       ~~~~~~~~
Unexpected token 'HostIPv4' in expression or statement.
At line:1 char:47
+ [Environment]::SetEnvironmentVariable(HostIPv4, 192.168.255.14:, Mach ...
+                                               ~
Missing argument in parameter list.
At line:1 char:73
+ ... ironment]::SetEnvironmentVariable(HostIPv4, 192.168.255.14:, Machine)
+                                                                         ~
Unexpected token ')' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall

可能是什么问题?

【问题讨论】:

  • 是否有理由使用 PowerShell 而不是 SETX
  • 好吧,我知道我需要它的目标机器总是有可用的 Powershell。 PS 不必被批准在机器上使用。 Setx 必须获得批准才能使用。

标签: powershell variables cmd environment


【解决方案1】:

PowerShell的命令行解析去掉双引号,试试用单引号:

powershell [Environment]::SetEnvironmentVariable('HostIPv4', '192.168.255.14:', 'Machine')

另请注意,您必须重新打开一个新的进程窗口才能查看结果(这是命令 shell 的已知行为,另请参阅:C# set environment variable

【讨论】:

  • 谢谢您,Iron,您的回答。如此简单,如此有效——有点尴尬,我自己没想到。它有效!
【解决方案2】:

iRon's helpful answer 解释了问题并有效,但我建议采用一种通常更强大的方法来从cmd.exe 调用 PowerShell 命令

  • 明确使用-Command,因为在 PSv6 中默认值将更改为 -File,需要 脚本 文件名而不是命令。

  • 使用-NoProfile,以避免不必要地加载 PowerShell 配置文件并获得更可预测的执行环境。

  • 双引号您的整个 PowerShell 命令,以保护它免受cmd.exe 可能不需要的预先解释。

powershell -NoProfile -Command "[Environment]::SetEnvironmentVariable('HostIPv4', '192.168.255.14:', 'Machine')"

使用' 代替" inside 命令字符串是避免转义 嵌入" 字符的简单方法,效果很好在这里,但如果您确实需要嵌入 "(用于插入字符串),请将它们转义为 \"(原文如此)或 """(原文如此)。

【讨论】:

  • 谢谢你,mklement0,我会考虑你的建议。我的直接问题解决了。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 2013-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2020-05-21
相关资源
最近更新 更多