Windows - Loop for to variabler

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har følgende ps1-fil (scriptet nedenfor, desværre skal det være PowerShell, ikke noget nemmere), køre en curl anmodning, tage et stykke af det ud til en fil og køre nogle tekst udskiftninger.


$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


Skriptet som det er, giver mig en transaktionsværdi (tre rækker i csv: transaktionen, noden og et tal). I praksis skal jeg bruge et array eller en liste med 10 maskiner og 4 forskellige transaktioner.


Mit problem er at oprette en loop til to variabler, jeg skal køre OUTPUT-delen 40 gange (4 transaktioner X 10 noder). Jeg har lavet lignende ting i Python, bash, men jeg finder mig forbløffet og ude af tid i PowerShell. Jeg spiste timer rundt på nettet og prøvede ikke-fungerende eksempler.


Kan du give en hånd?

Bedste reference


Jeg har tilføjet en s til dine variabler og derefter antaget, at de første 'transaktioner' skulle være i ydersiden:


$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
    }
}

Andre referencer 1


Jeg tror stadig, at den bedste måde at håndtere curl output på ville være at analysere med objekttypen, den returnerer (html/xml/json).


Når du analyserer tekstuddata, bruger jeg d. Brug et regulært udtryk. PowerShell understøtter lookarounds, så dette script (med omvendt node-transaktionsordre): [7]


## Q:Test2017913SO\_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


Vil producere denne (simuleret) skærm:


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


og fil output:


> 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"