如何在Powershell中将前一条命令的输出作为后一条命令的参数?
PowerShell单行管道参数传递错误排查
错误原因
你的写法存在两个核心问题:
- 变量赋值时序错误:
$obj的赋值需要等整行管道命令全部执行完成后才会生效,你在管道中间调用$obj.Root时,$obj还未被赋值为空值,无法读取到Root属性。 - 管道参数绑定冲突:前一个
Get-Item .的输出会通过管道传给下一个Get-Item,同时你又显式传入了$obj.Root作为参数,Get-Item无法同时处理管道输入和显式传入的路径参数,因此抛出参数绑定异常。
正确单行实现方案
如果你要实现「获取当前目录对象→取其根目录→输出根目录所有属性」的需求,不需要提前声明变量,用$_指代管道传递的当前对象即可,写法如下:
Get-Item . | ForEach-Object { Get-Item $_.Root } | Format-List *
如果需要把最终结果赋值给变量,直接在开头加变量赋值即可:
$obj = Get-Item . | ForEach-Object { Get-Item $_.Root } | Format-List *
追求更短的写法适合嵌入其他语言脚本的话,可以用ForEach-Object的别名%:
$obj = Get-Item . | % { Get-Item $_.Root } | Format-List *
如果你要在Go、Python脚本中调用这个PowerShell命令,注意根据调用时的引号规则做好转义,比如外层用双引号包裹整个PowerShell命令时,要对内部的
$、{等特殊符号做对应转义,避免被宿主语言提前解析。
内容的提问来源于stack exchange,提问作者fhcat
相关产品推荐
相关产品推荐

