2017-09-12 1 views
0

J'ai le fichier ps1 suivant (script ci-dessous, malheureusement il doit s'agir de PowerShell, rien de plus simple), exécutant une requête curl, en prenant une partie dans un fichier, puis en exécutant quelques remplacements de texte.Boucle pour deux variables

$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 [email protected] $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 

Le script tel qu'il est me donne une valeur transactionnelle (trois lignes dans la csv: la transaction, le noeud, et un nombre). En pratique, je devrais utiliser un tableau ou une liste avec 10 machines, et 4 transactions différentes.

Mon problème est de mettre en place une boucle pour deux variables, j'ai besoin d'exécuter la partie OUTPUT 40 fois (4 transactions X 10 nœuds). J'ai fait des trucs similaires en Python, mais je me retrouve déconcerté et hors du temps dans PowerShell. J'ai passé des heures à courir sur le Web et à essayer des exemples qui ne fonctionnent pas.

Pourriez-vous donner un coup de main?

+2

Ce n'est pas comment vous manipuleriez ces choses dans PowerShell. Du tout. Veuillez fournir un exemple de sortie curl (non filtrée) et la sortie CSV que vous souhaitez créer à partir de celle-ci. –

+0

De plus, '-replace' utilise regex – TheIncorrigible1

+0

A quoi ressemble l'URL quand c'est fait,' https: // serv/trans = 1node1'? – TheIncorrigible1

Répondre

2

J'ai ajouté un s à vos variables et suppose les premières « opérations » auraient besoin d'être dans le outerLoop:

$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 [email protected] $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 
    } 
} 
+0

Je suggérerais de changer l'appel externe en '& 'path \ en \ curl.exe'' et si c'est' PSv3' +, '&' path \ en \ curl.exe '-%' – TheIncorrigible1

+1

Ou au lieu de rouler use Invoke-webrequest –

+0

Merci, j'ai récupéré la partie Get-Content de la boucle et j'ai ajouté Stop-Process à ps à la fin du script, sinon le tout se bloque s'il est exécuté plus d'une fois. –

1

Je pense toujours la meilleure façon de gérer la sortie boucle serait pour analyser avec le type d'objet qu'il renvoie (html/xml/json).

Lors de l'analyse de la sortie de texte, j'utiliserais alors une expression régulière. PowerShell prend en charge lookarounds donc ce script (avec ordre de transaction noeud inversé):

## Q:\Test\2017\09\13\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 [email protected] $url$transaction$node | Where-Object {$_ -match $RE}| 
     ForEach-Object {[pscustomobject]@{ 
      node = $node 
      transaction = $transaction 
      value = $Matches[0]} 
     } 
    } 
} 
$ATM 
$ATM | Export-Csv '.\ATM.csv' -NoTypeInformation 

produira Ceci (simulés):

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 

et sortie du fichier:

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

TL; DR et le problème a été résolu avec findstr et value.Replace les appels, mais pour une utilisation future - comment puis-je analyser un xml avec PowerShell? Le curl renvoie un tas de quelque chose lignes et j'ai seulement besoin du numéro de la ligne: numéro. –