环境变量,PowerShell 会话与从 CMD 启动
Environment variable, PowerShell session vs. started from CMD
我正在尝试从命令提示符 window(运行 作为管理员)中 运行 PowerShell 命令,但它失败了。而当我 运行 从 PowerShell window 中执行相同的命令时,它 运行 没问题。
这是 PowerShell 中没有错误的命令 window:
Powershell [Environment]::SetEnvironmentVariable("HostIPv4", "192.168.255.14:", "Machine")
在命令提示符 window 中失败:
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 的命令行解析去掉了双引号,尝试使用单引号:
powershell [Environment]::SetEnvironmentVariable('HostIPv4', '192.168.255.14:', 'Machine')
另请注意,您必须重新打开一个新进程 window 才能看到结果(这是命令 shell 的已知行为,另请参阅:C# set environment variable)
解释了问题并有效 ,但我建议采用 一种通常更稳健的方法来从 cmd.exe
调用 PowerShell 命令:
明确使用-Command
,因为在 PSv6 中默认值将更改为 -File
,需要一个 脚本 文件名而不是命令。
使用 -NoProfile
,以避免不必要地加载 PowerShell 配置文件并获得更可预测的执行环境。
双引号 你的整个 PowerShell 命令 来保护它来自 cmd.exe
.
可能不需要的前期解释
powershell -NoProfile -Command "[Environment]::SetEnvironmentVariable('HostIPv4', '192.168.255.14:', 'Machine')"
在命令字符串中使用'
而不是"
是避免转义[=的简单方法50=] 嵌入 "
字符,在这里工作正常,但如果您确实需要嵌入 "
(用于插入字符串),请将它们转义为 \"
(原文如此)或 """
(原文如此)。
我正在尝试从命令提示符 window(运行 作为管理员)中 运行 PowerShell 命令,但它失败了。而当我 运行 从 PowerShell window 中执行相同的命令时,它 运行 没问题。
这是 PowerShell 中没有错误的命令 window:
Powershell [Environment]::SetEnvironmentVariable("HostIPv4", "192.168.255.14:", "Machine")
在命令提示符 window 中失败:
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 的命令行解析去掉了双引号,尝试使用单引号:
powershell [Environment]::SetEnvironmentVariable('HostIPv4', '192.168.255.14:', 'Machine')
另请注意,您必须重新打开一个新进程 window 才能看到结果(这是命令 shell 的已知行为,另请参阅:C# set environment variable)
cmd.exe
调用 PowerShell 命令:
明确使用
-Command
,因为在 PSv6 中默认值将更改为-File
,需要一个 脚本 文件名而不是命令。使用
-NoProfile
,以避免不必要地加载 PowerShell 配置文件并获得更可预测的执行环境。双引号 你的整个 PowerShell 命令 来保护它来自
cmd.exe
. 可能不需要的前期解释
powershell -NoProfile -Command "[Environment]::SetEnvironmentVariable('HostIPv4', '192.168.255.14:', 'Machine')"
在命令字符串中使用'
而不是"
是避免转义[=的简单方法50=] 嵌入 "
字符,在这里工作正常,但如果您确实需要嵌入 "
(用于插入字符串),请将它们转义为 \"
(原文如此)或 """
(原文如此)。