powershell select-foreach 循环的字符串输出
powershell select-string output for loop foreach
我是传统 bash 用户,因此我不明白如何在 powershell 中使用 foreach。
Powershell
我需要输出
Vasya
http://192.168.10.61:8085/data.json
Misha
http://192.168.10.82:8085/data.json
但我收到另一个输出
Vasya
Misha
http://192.168.10.61:8085/data.json
http://192.168.10.82:8085/data.json
- 脚本
$pspath="E:\monitor.ps1"
$txtpath="E:\temp.txt"
$user1="Vasya"
$user2="Misha"
$ip1="http://192.168.10.61:8085/data.json"
$ip2="http://192.168.10.82:8085/data.json"
$list = @"
${user1}-${ip1}
${user2}-${ip2}
"@
foreach ($zab in $list)
{
$regex_url = 'http://\d+.\d+.\d+.\d+:\d+/data.json'
$regex_name = "([A-Z]|[a-z])\w+"
$name = echo $zab |%{$_.split('-')} |sls -pattern $regex_name -AllMatches |%{$_.Matches -notmatch 'http|json|data'} |%{$_.Value}
$url = echo $zab |%{$_.split('-')} |sls -pattern $regex_url -AllMatches |%{$_.Matches} |%{$_.Value}
echo $name
echo $url
}
Bash
在 bash 中工作很完美。
- 脚本
#!/bin/bash
users="Vasya-http://192.168.10.61:8085/data.json Misha-http://192.168.10.82:8085/data.json"
for zab in $users; do
name=$(echo $zab |cut -f 1 -d -)
url=$(echo $zab |cut -f 2 -d -)
echo $name
echo $url
done
exit 0
帮帮我的手。
这个:
$list = @"
${user1}-${ip1}
${user2}-${ip2}
"@
是单个 multi-line 字符串,因此 foreach
循环是多余的。
拆分 运行 之前的字符串 Select-String
:
foreach($zab in $list -split '\r?\n'){
...
}
您的 PowerShell 脚本与 bash 脚本完全不同。
我不知道您是否出于其他原因需要 Select-String
更复杂,
但在 PowerShell 中它也可以像这样简单:
$users="Vasya-http://192.168.10.61:8085/data.json Misha-http://192.168.10.82:8085/data.json"
foreach($zab in ($users -split ' ')){
$name,$url = $zab -split '-',2
[PSCustomObject]@{
Name = $name
Url = $url
}
}
对于这个面向对象的示例输出:
Name Url
---- ---
Vasya http://192.168.10.61:8085/data.json
Misha http://192.168.10.82:8085/data.json
我是传统 bash 用户,因此我不明白如何在 powershell 中使用 foreach。
Powershell
我需要输出
Vasya
http://192.168.10.61:8085/data.json
Misha
http://192.168.10.82:8085/data.json
但我收到另一个输出
Vasya
Misha
http://192.168.10.61:8085/data.json
http://192.168.10.82:8085/data.json
- 脚本
$pspath="E:\monitor.ps1"
$txtpath="E:\temp.txt"
$user1="Vasya"
$user2="Misha"
$ip1="http://192.168.10.61:8085/data.json"
$ip2="http://192.168.10.82:8085/data.json"
$list = @"
${user1}-${ip1}
${user2}-${ip2}
"@
foreach ($zab in $list)
{
$regex_url = 'http://\d+.\d+.\d+.\d+:\d+/data.json'
$regex_name = "([A-Z]|[a-z])\w+"
$name = echo $zab |%{$_.split('-')} |sls -pattern $regex_name -AllMatches |%{$_.Matches -notmatch 'http|json|data'} |%{$_.Value}
$url = echo $zab |%{$_.split('-')} |sls -pattern $regex_url -AllMatches |%{$_.Matches} |%{$_.Value}
echo $name
echo $url
}
Bash
在 bash 中工作很完美。
- 脚本
#!/bin/bash
users="Vasya-http://192.168.10.61:8085/data.json Misha-http://192.168.10.82:8085/data.json"
for zab in $users; do
name=$(echo $zab |cut -f 1 -d -)
url=$(echo $zab |cut -f 2 -d -)
echo $name
echo $url
done
exit 0
帮帮我的手。
这个:
$list = @"
${user1}-${ip1}
${user2}-${ip2}
"@
是单个 multi-line 字符串,因此 foreach
循环是多余的。
拆分 运行 之前的字符串 Select-String
:
foreach($zab in $list -split '\r?\n'){
...
}
您的 PowerShell 脚本与 bash 脚本完全不同。
我不知道您是否出于其他原因需要 Select-String
更复杂,
但在 PowerShell 中它也可以像这样简单:
$users="Vasya-http://192.168.10.61:8085/data.json Misha-http://192.168.10.82:8085/data.json"
foreach($zab in ($users -split ' ')){
$name,$url = $zab -split '-',2
[PSCustomObject]@{
Name = $name
Url = $url
}
}
对于这个面向对象的示例输出:
Name Url
---- ---
Vasya http://192.168.10.61:8085/data.json
Misha http://192.168.10.82:8085/data.json