循环两个变量
Loop for two variables
我有以下 ps1 文件(下面的脚本,不幸的是它必须是 PowerShell,没有什么更容易的),运行宁一个 curl
请求,从中取出一部分到一个文件,然后 运行ning 一些文本替换。
$url = "https://someserver/trans="
$transaction = "1" #There are 4 transactions
$node = "node1" #There are 10 nodes
Remove-Item ATM.csv -Force
# So far so good
# Below is what I'd use as a function in bash. No sure what/how to do in PS:
#OUTPUT:
echo $transaction";"$node >> ATM.csv
curl -v -k -u user@pass $url$transaction$node | findstr "<value>" >> ATM.csv
(Get-Content ATM.csv) -replace "<value>"," " | Out-File ATM.csv
(Get-Content ATM.csv) -replace "</value>"," " | Out-File ATM.csv
(Get-Content ATM.csv) -replace " ","" | Out-File ATM.csv
脚本本身给了我一个交易值(csv 中的三行:交易、节点和一个数字)。实际上,我需要使用包含 10 台机器和 4 个不同事务的数组或列表。
我的问题是为两个变量设置循环,我需要 运行 输出部分 40 次(4 个事务 X 10 个节点)。我在 Python、bash 中做过类似的事情,但我发现自己在 PowerShell 中感到困惑和没时间。我花了几个小时 运行 浏览网络并尝试无效示例。
你能帮帮我吗?
我已经在你的变量中添加了一个 s,然后假设第一个 "transactions" 需要在外循环中:
$url = "https://someserver/trans="
$transactions = '1','2','3','4' #There are 4 transactions
$nodes = 'node1','node2','node3','node4','node5','node6' #There are 10 nodes
Remove-Item ATM.csv -Force
# So far so good
# Below is what I'd use as a function in bash. No sure what/how to do in PS:
#OUTPUT:
foreach($transaction in $transactions)
{
foreach($node in $nodes)
{
"$transaction;$node" |out-file -Append ATM.csv
curl -v -k -u user@pass $url$transaction$node | findstr "<value>" | out-file -Append ATM.csv
(Get-Content ATM.csv) -replace "<value>"," " | Out-File -Append ATM.csv
(Get-Content ATM.csv) -replace "</value>"," " | Out-File -Append ATM.csv
(Get-Content ATM.csv) -replace " ","" | Out-File -Append ATM.csv
}
}
我仍然认为处理 curl 输出的最佳方法是使用它的对象类型进行解析 returns (html/xml/json)。
在解析文本输出时,我会使用正则表达式。 PowerShell 支持 lookarounds 所以此脚本(具有反向节点事务顺序):
## Q:\Test17\SO_46179493.ps1
$url = "https://someserver/trans="
$transactions = 1..4|ForEach-Object{"$_"} #There are 4 transactions
$nodes = 1..10|ForEach-Object{"node{0}" -f $_} #There are 10 nodes
$RE = [RegEx]'(?<=\<value\>).+(?=\<\/value\>)'
# The RE uses lookbehind and lookahead to assert the captured value is surrounded by
# the tags <value> and </value>
$ATM = ForEach($node in $nodes){
ForEach($transaction in $transactions) {
curl -v -k -u user@pass $url$transaction$node | Where-Object {$_ -match $RE}|
ForEach-Object {[pscustomobject]@{
node = $node
transaction = $transaction
value = $Matches[0]}
}
}
}
$ATM
$ATM | Export-Csv '.\ATM.csv' -NoTypeInformation
将产生这个(模拟)显示:
node transaction value
---- ----------- -----
node1 1 79719
node1 2 77829
node1 3 90337
node1 4 39470
...
node10 1 17294
node10 2 62468
node10 3 70542
node10 4 46147
和文件输出:
> cat .\ATM.csv
"node","transaction","value"
"node1","1","79719"
"node1","2","77829"
"node1","3","90337"
"node1","4","39470"
...
"node10","1","17294"
"node10","2","62468"
"node10","3","70542"
"node10","4","46147"
我有以下 ps1 文件(下面的脚本,不幸的是它必须是 PowerShell,没有什么更容易的),运行宁一个 curl
请求,从中取出一部分到一个文件,然后 运行ning 一些文本替换。
$url = "https://someserver/trans="
$transaction = "1" #There are 4 transactions
$node = "node1" #There are 10 nodes
Remove-Item ATM.csv -Force
# So far so good
# Below is what I'd use as a function in bash. No sure what/how to do in PS:
#OUTPUT:
echo $transaction";"$node >> ATM.csv
curl -v -k -u user@pass $url$transaction$node | findstr "<value>" >> ATM.csv
(Get-Content ATM.csv) -replace "<value>"," " | Out-File ATM.csv
(Get-Content ATM.csv) -replace "</value>"," " | Out-File ATM.csv
(Get-Content ATM.csv) -replace " ","" | Out-File ATM.csv
脚本本身给了我一个交易值(csv 中的三行:交易、节点和一个数字)。实际上,我需要使用包含 10 台机器和 4 个不同事务的数组或列表。
我的问题是为两个变量设置循环,我需要 运行 输出部分 40 次(4 个事务 X 10 个节点)。我在 Python、bash 中做过类似的事情,但我发现自己在 PowerShell 中感到困惑和没时间。我花了几个小时 运行 浏览网络并尝试无效示例。
你能帮帮我吗?
我已经在你的变量中添加了一个 s,然后假设第一个 "transactions" 需要在外循环中:
$url = "https://someserver/trans="
$transactions = '1','2','3','4' #There are 4 transactions
$nodes = 'node1','node2','node3','node4','node5','node6' #There are 10 nodes
Remove-Item ATM.csv -Force
# So far so good
# Below is what I'd use as a function in bash. No sure what/how to do in PS:
#OUTPUT:
foreach($transaction in $transactions)
{
foreach($node in $nodes)
{
"$transaction;$node" |out-file -Append ATM.csv
curl -v -k -u user@pass $url$transaction$node | findstr "<value>" | out-file -Append ATM.csv
(Get-Content ATM.csv) -replace "<value>"," " | Out-File -Append ATM.csv
(Get-Content ATM.csv) -replace "</value>"," " | Out-File -Append ATM.csv
(Get-Content ATM.csv) -replace " ","" | Out-File -Append ATM.csv
}
}
我仍然认为处理 curl 输出的最佳方法是使用它的对象类型进行解析 returns (html/xml/json)。
在解析文本输出时,我会使用正则表达式。 PowerShell 支持 lookarounds 所以此脚本(具有反向节点事务顺序):
## Q:\Test17\SO_46179493.ps1
$url = "https://someserver/trans="
$transactions = 1..4|ForEach-Object{"$_"} #There are 4 transactions
$nodes = 1..10|ForEach-Object{"node{0}" -f $_} #There are 10 nodes
$RE = [RegEx]'(?<=\<value\>).+(?=\<\/value\>)'
# The RE uses lookbehind and lookahead to assert the captured value is surrounded by
# the tags <value> and </value>
$ATM = ForEach($node in $nodes){
ForEach($transaction in $transactions) {
curl -v -k -u user@pass $url$transaction$node | Where-Object {$_ -match $RE}|
ForEach-Object {[pscustomobject]@{
node = $node
transaction = $transaction
value = $Matches[0]}
}
}
}
$ATM
$ATM | Export-Csv '.\ATM.csv' -NoTypeInformation
将产生这个(模拟)显示:
node transaction value
---- ----------- -----
node1 1 79719
node1 2 77829
node1 3 90337
node1 4 39470
...
node10 1 17294
node10 2 62468
node10 3 70542
node10 4 46147
和文件输出:
> cat .\ATM.csv
"node","transaction","value"
"node1","1","79719"
"node1","2","77829"
"node1","3","90337"
"node1","4","39470"
...
"node10","1","17294"
"node10","2","62468"
"node10","3","70542"
"node10","4","46147"