如何将PowerShell管道对象作为参数传入外部应用?
问题:如何将PowerShell管道中的对象传入外部应用?
我正尝试将以下Bash语句改写为PowerShell命令:git show-ref | cut -d' ' -f2 | grep -E 'pull|merge-requests' | xargs -r -L1 git update-ref -d
该Bash语句的功能分解:
git show-ref列出Git仓库中的引用cut -d' ' -f2按空格分割每行并提取第二个字段(引用路径)grep -E 'pull|merge-requests'筛选包含pull或merge-requests的引用xargs -r -L1 git update-ref -d逐行将筛选结果作为参数传入git update-ref -d,删除对应引用
我已在PowerShell中完成前三步:git show-ref | Foreach-Object {$_.split(' ')[1]} | Select-String 'pull|merge-requests'
请问如何完成最后一步,将结果传入git update-ref -d?
解决方案
方法1:通过ForEach-Object逐行执行外部命令
Select-String返回的是MatchInfo对象而非纯字符串,需要提取对象的Line属性拿到实际引用路径,再传入git命令:
git show-ref | Foreach-Object { $_.Split(' ', 2)[1].Trim() } | Select-String 'pull|merge-requests' | Foreach-Object { git update-ref -d $_.Line }
Split(' ', 2):限制分割为2个部分,避免引用路径中意外出现空格导致截断.Trim():去除行尾的换行符或空白字符
方法2:用Where-Object替代Select-String,直接处理纯字符串
改用Where-Object过滤字符串,管道中直接传递纯文本,代码更简洁:
git show-ref | Foreach-Object { $_.Split(' ', 2)[1].Trim() } | Where-Object { $_ -match 'pull|merge-requests' } | Foreach-Object { git update-ref -d $_ }
这里-match操作符支持正则匹配,和Bash的grep -E效果一致。
方法3:使用Start-Process(适合需要精细控制的场景)
如果需要对外部命令执行做更多控制(比如捕获输出、指定工作目录),可以用Start-Process:
git show-ref | Foreach-Object { $_.Split(' ', 2)[1].Trim() } | Where-Object { $_ -match 'pull|merge-requests' } | Foreach-Object { Start-Process git -ArgumentList "update-ref -d $_" -NoNewWindow -Wait }
-NoNewWindow:不在新窗口执行命令-Wait:等待当前命令执行完成再处理下一个
内容的提问来源于stack exchange,提问作者Simon Elms
相关产品推荐
相关产品推荐

