如何在PowerShell 5.1中实现类似Bash的多组大括号展开?
PowerShell 5.1实现Bash风格的批量主机名生成与Ping操作
当前使用的是Windows 10自带的PowerShell版本,具体信息如下:
$PSVersionTable Name Value ---- ----- PSVersion 5.1.19041.4291 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.19041.4291 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1
在Bash中可通过多组大括号展开一次性生成组合列表,例如以下命令会生成18个主机名并逐个执行Ping操作:
for s in FISP{CC,CDS,TAP}PGS{302,405}{a,b,c}; do ping -c3 $s; done
现需在PowerShell 5.1中实现相同功能,替代以下嵌套循环写法:
foreach ($app in "CC","CDS","TAP") { foreach ($client in 302,405) { foreach ($node in "a","b","c") { $s="FISP${app}PGS${client}${Node}" ping $s } } }
方法一:管道链式笛卡尔积生成(原生PowerShell风格)
通过嵌套管道一次性生成所有主机名组合,无需多层循环结构:
"CC","CDS","TAP" | ForEach-Object { $app = $_ 302,405 | ForEach-Object { $client = $_ "a","b","c" | ForEach-Object { "FISP${app}PGS${client}$_" } } } | ForEach-Object { ping $_ }
若追求极致简洁,可压缩为一行(%是ForEach-Object的别名):
"CC","CDS","TAP"|%{$a=$_;302,405|%{$c=$_;"a","b","c"|%{"FISP${a}PGS${c}$_"}}}|%{ping $_}
方法二:LINQ查询语法生成主机名
用声明式的LINQ查询语法生成完整主机名列表,再批量执行Ping:
$hosts = ( from $app in "CC","CDS","TAP" from $client in 302,405 from $node in "a","b","c" select "FISP${app}PGS${client}${node}" ) $hosts | ForEach-Object { ping $_ }
方法三:模拟Bash大括号展开(仅作参考)
若想模仿Bash的大括号语法,可通过字符串替换实现,但可读性较差,适合简单场景:
$pattern = "FISP{CC,CDS,TAP}PGS{302,405}{a,b,c}" # 递归替换大括号内的组合 while ($pattern -match '\{([^{}]+)\}') { $parts = $matches[1] -split ',' $pattern = $pattern -replace $matches[0], ($parts -join ' ') } # 拆分生成主机名并执行Ping $pattern -split ' ' | ForEach-Object { ping $_ }
内容的提问来源于stack exchange,提问作者RonJohn
相关产品推荐
相关产品推荐

