PowerShell外部调用字符串命令未展开问题求解
问题分析
你的代码无法运行有两个核心原因:
- 父PowerShell提前解析子进程变量:原
$command用双引号定义,其中的$input会被父进程解析为空值,导致子进程拿到的命令已丢失$input引用。 - 子进程无法识别父进程变量:用
-Command {$command}传递时,大括号是子进程的脚本块,里面的$command是子进程未定义的变量,而非父进程中存储的命令字符串。
解决方案
1. 正确定义命令字符串
用单引号或Here-String定义$command,避免父进程提前解析子进程需要的$input变量:
# 方式1:单引号包裹,完全保留变量原义 $command = '$arr = @($input) $arr.count Write-Host $arr[0]' # 方式2:Here-String,适合多行命令,转义$避免父进程解析 $command = @" `$arr = @(`$input) `$arr.count Write-Host `$arr[0] "@
2. 正确传递命令给子PowerShell
将父进程的$command变量展开为字符串后传递给子进程的-Command参数,不要用脚本块包裹:
"Classical Music for When You are on a Deadline." | & cmd /C powershell -Command "$command"
完整可运行代码
$command = '$arr = @($input) $arr.count Write-Host $arr[0]' "Classical Music for When You are on a Deadline." | & cmd /C powershell -Command "$command"
简化方式(直接传递命令)
如果不需要提前存储命令字符串,可直接将命令内容转义后传递:
"Classical Music for When You are on a Deadline." | & cmd /C powershell -Command "`$arr = @(`$input); `$arr.count; Write-Host `$arr[0]"
额外说明
- 通过
cmd /C调用PowerShell时,-Command参数接收的是字符串而非脚本块,父PowerShell会先展开双引号内的变量,再将完整命令传递给子进程。 - 子进程中的
$input会自动接收管道传入的内容,只要确保父进程未提前替换该变量即可正常工作。
内容的提问来源于stack exchange,提问作者Liviu
相关产品推荐
相关产品推荐

