我需要运行这个命令,它是从另一个脚本中读取的。
$command = "$arr = @($input)
$arr.count
Write-Host $arr[0]"
"Classical Music for When You are on a Deadline." | & cmd /C powershell -Command {$command}
所以我通过管道得到一些东西,然后在我的字符串命令中使用它。代码不起作用,因为$command
没有扩展到调用内部的字符串,因此在启动的powershell命令中是未知的。
这些命令按预期工作,但命令不是从字符串中获取的:
"Classical Music for When You are on a Deadline." | & cmd /C powershell -Command {Invoke-Expression "Write-Host $input"}
# No: System.Management.Automation.Runspaces.PipelineReader`1+<GetReadEnumerator>d__20[System.Object]
# "Classical Music for When You are on a Deadline." | & cmd /C powershell -Command {Write-Host $input}
"Classical Music for When You are on a Deadline." | & cmd /C powershell -Command {$arr = @($input)
$arr.count
Write-Host $arr[0]}
2条答案
按热度按时间dwbf0jvd1#
{ $command }
* 不会 * 将字符串$command
的值转换为script block-它只是创建一个引用名为$command
的变量的脚本块。[scriptblock]::Create()
**cmd /c
调用powershell.exe
-通常没有必要。因此:
注:
"
字符 * 手动转义为 *\"
-请参见this answer。换句话说就是:虽然
powershell -Command $command
可以 * 与特定的示例字符串 * 一起工作,但如果字符串包含"
字符,它将失败,这在Windows PowerShell中是不变的,并且至少是PowerShell(Core)7.2.x。退一步说:由于您已经在PowerShell中运行,因此无需创建 * 另一个 * 示例作为 * 子进程 *,这样做开销很大。
注意事项:
&
,调用运算符用于调用脚本块,该脚本块在 child 范围内运行。.
(点源运算符)。Invoke-Expression
(iex
)--应该是generally be avoided--在这里不是一个选项,因为它不支持使用管道将数据传递给被评估的代码。mdfafbf12#
您可以使用Invoke-Expression cmdlet将变量字符串作为命令在PowerShell中运行。例如:
Invoke-Expression $commandString