Question [Résolu] Accès à une variable dans un workflow
- DALLAVALLE Rémy
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 16
- Remerciements reçus 0
il y a 5 ans 5 mois #25236
par DALLAVALLE Rémy
[Résolu] Accès à une variable dans un workflow a été créé par DALLAVALLE Rémy
Bonjour
Je souhaite accéder à une variable initialisée hors d'un workflow, dans un workflow.
Ce workflow fait un foreach parallel pour pinger une liste de machine, et pour chaque poste qui répond, copie un dossier.
Cependant, le dossier pouvant changer, l'utilisateur sélectionnera sa cible via une dialog box pour choisir son répertoire.
Mon Workflow ressemble a ceci :
[code:1]$ip_list = Get-Content -LiteralPath \".\pclist.txt\"
workflow parallelPingCOmputer {
Param($computers,
$location)
foreach -parallel($computer in $computers)
{
$ping = $null
If (Test-Connection -ComputerName $computer -Count 1 -quiet) {
$ping = \"Le poste répond\"
Copy-Item -Path $location -Destination \"\\$computer\c$\destination\\" -Force -Recurse -ErrorAction stop
} else {
$ping = \"Le poste ne répond pas\"
}
$arrayResults = New-Object -Type PSObject -Property @{
Hostname = $computer
Ping = $ping
}
return($arrayResults)
}
}
parallelPingComputer -computers $ip_list | Select-Object Hostname, ping | Out-GridView[/code:1]
Seulement, la variable $location renvoi la valeur null apparemment (message d'erreur powershell). Ca fonctionne si je l'inclue dans le workflow, mais avec le \"folder-picker\" que je vais utiliser, il faut impérativement que cette variable soit créée en dehors du workflow, et accédée à l'intérieur de celui-ci. A moins qu'il est possible d'inclure le \"folder-picker\" dans le workflow, mais je n'ai pas réussi.
Auriez-vous une idée svp ?
Merci beaucoup d'avance.<br><br>Message édité par: Arnaud, à: 11/04/18 13:48
Je souhaite accéder à une variable initialisée hors d'un workflow, dans un workflow.
Ce workflow fait un foreach parallel pour pinger une liste de machine, et pour chaque poste qui répond, copie un dossier.
Cependant, le dossier pouvant changer, l'utilisateur sélectionnera sa cible via une dialog box pour choisir son répertoire.
Mon Workflow ressemble a ceci :
[code:1]$ip_list = Get-Content -LiteralPath \".\pclist.txt\"
workflow parallelPingCOmputer {
Param($computers,
$location)
foreach -parallel($computer in $computers)
{
$ping = $null
If (Test-Connection -ComputerName $computer -Count 1 -quiet) {
$ping = \"Le poste répond\"
Copy-Item -Path $location -Destination \"\\$computer\c$\destination\\" -Force -Recurse -ErrorAction stop
} else {
$ping = \"Le poste ne répond pas\"
}
$arrayResults = New-Object -Type PSObject -Property @{
Hostname = $computer
Ping = $ping
}
return($arrayResults)
}
}
parallelPingComputer -computers $ip_list | Select-Object Hostname, ping | Out-GridView[/code:1]
Seulement, la variable $location renvoi la valeur null apparemment (message d'erreur powershell). Ca fonctionne si je l'inclue dans le workflow, mais avec le \"folder-picker\" que je vais utiliser, il faut impérativement que cette variable soit créée en dehors du workflow, et accédée à l'intérieur de celui-ci. A moins qu'il est possible d'inclure le \"folder-picker\" dans le workflow, mais je n'ai pas réussi.
Auriez-vous une idée svp ?
Merci beaucoup d'avance.<br><br>Message édité par: Arnaud, à: 11/04/18 13:48
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 5 ans 5 mois #25245
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ou d'un conseil ?
Réponse de Arnaud Petitjean sur le sujet Re:Accès à une variable dans un workflow.
Hello,
A tout hasard essaie d'accèder à ta variable externe à ton workflow avec la syntaxe $using:MaVariable
Mais personnellement j'éviterai d'utiliser les workflows...
Arnaud
A tout hasard essaie d'accèder à ta variable externe à ton workflow avec la syntaxe $using:MaVariable
Mais personnellement j'éviterai d'utiliser les workflows...
Arnaud
MVP PowerShell et créateur de ce magnifique forum

Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ou d'un conseil ?
Connexion ou Créer un compte pour participer à la conversation.
- DALLAVALLE Rémy
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 16
- Remerciements reçus 0
il y a 5 ans 5 mois #25247
par DALLAVALLE Rémy
Réponse de DALLAVALLE Rémy sur le sujet Re:Accès à une variable dans un workflow.
Merci Arnaud.
J'ai déjà essayé avec $using, mais sans succès. Le $using ne peut être utilisé qu'avec invoke command, ou inlinescript... Mais même en essayant ça, j'ai pas réussi.
Par contre, pourquoi me conseille tu d'éviter les workflows ?<br><br>Message édité par: Neandril, à: 3/04/18 18:12
J'ai déjà essayé avec $using, mais sans succès. Le $using ne peut être utilisé qu'avec invoke command, ou inlinescript... Mais même en essayant ça, j'ai pas réussi.
Par contre, pourquoi me conseille tu d'éviter les workflows ?<br><br>Message édité par: Neandril, à: 3/04/18 18:12
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6290
- Remerciements reçus 67
il y a 5 ans 5 mois #25251
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Accès à une variable dans un workflow.
Salut,
je ne rencontre pas de pb avec ton code (PS v5.1 Seven) :
[code:1]
workflow parallelPingCOmputer {
Param($computers,
$location)
Write-Warning \"Location WF : $location\"
foreach -parallel($computer in $computers)
{
Write-Warning \"Location // : $location\"
$ping = $null
If (Test-Connection -ComputerName $computer -Count 1 -quiet) {
$ping = \"Le poste répond\"
Copy-Item -Path $location -Destination \"\\$computer\c$\destination\\" -Force -Recurse -ErrorAction stop
} else {
$ping = \"Le poste ne répond pas\"
}
Write-output (New-Object -Type PSObject -Property @{
Hostname = $computer
Ping = $ping
})
}
Write-Warning \"Fin \"
}
parallelPingCOmputer -computers 'localhost' -Location c:\temp\Test
# WARNING: [localhost]:Location WF : c:\temp\Test
# WARNING: [localhost]:Location // : c:\temp\Test
#
#
# Ping : Le poste répond
# Hostname : localhost
# PSComputerName : localhost
# PSSourceJobInstanceId : d17dbfe0-756a-47df-b8f0-7e58672980b5
#
# WARNING: [localhost]:F
[/code:1]
Il y a juste le return à retirer et à émettre l'objet résultat directement.
Personnellement je lui ajouterais une propriété de type booléen pour connaitre les machines en erreur.
je ne rencontre pas de pb avec ton code (PS v5.1 Seven) :
[code:1]
workflow parallelPingCOmputer {
Param($computers,
$location)
Write-Warning \"Location WF : $location\"
foreach -parallel($computer in $computers)
{
Write-Warning \"Location // : $location\"
$ping = $null
If (Test-Connection -ComputerName $computer -Count 1 -quiet) {
$ping = \"Le poste répond\"
Copy-Item -Path $location -Destination \"\\$computer\c$\destination\\" -Force -Recurse -ErrorAction stop
} else {
$ping = \"Le poste ne répond pas\"
}
Write-output (New-Object -Type PSObject -Property @{
Hostname = $computer
Ping = $ping
})
}
Write-Warning \"Fin \"
}
parallelPingCOmputer -computers 'localhost' -Location c:\temp\Test
# WARNING: [localhost]:Location WF : c:\temp\Test
# WARNING: [localhost]:Location // : c:\temp\Test
#
#
# Ping : Le poste répond
# Hostname : localhost
# PSComputerName : localhost
# PSSourceJobInstanceId : d17dbfe0-756a-47df-b8f0-7e58672980b5
#
# WARNING: [localhost]:F
[/code:1]
Il y a juste le return à retirer et à émettre l'objet résultat directement.
Personnellement je lui ajouterais une propriété de type booléen pour connaitre les machines en erreur.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- DALLAVALLE Rémy
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 16
- Remerciements reçus 0
il y a 5 ans 5 mois #25254
par DALLAVALLE Rémy
Réponse de DALLAVALLE Rémy sur le sujet Re:Accès à une variable dans un workflow.
Merci beaucoup.
Le premier test que je viens de réaliser par rapport à ton retour à l'air concluant.
Je n'avais effectivement pas renvoyer le résultat directement dans l'appel du Workflow.
Les machines en erreur je les capte par un bloc try / catch (que j'ai pas inclu dans ce post), et la sortie est redirigée vers un out-gridview + un csv.
Si d'après toi c'est mieux de renvoyer un objet de type booléen, je veux bien un exemple si ça te dérange pas.
Le premier test que je viens de réaliser par rapport à ton retour à l'air concluant.
Je n'avais effectivement pas renvoyer le résultat directement dans l'appel du Workflow.
Les machines en erreur je les capte par un bloc try / catch (que j'ai pas inclu dans ce post), et la sortie est redirigée vers un out-gridview + un csv.
Si d'après toi c'est mieux de renvoyer un objet de type booléen, je veux bien un exemple si ça te dérange pas.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6290
- Remerciements reçus 67
il y a 5 ans 5 mois #25255
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Accès à une variable dans un workflow.
Neandril écrit:
[code:1]
$IsConnected=Test-Connection -ComputerName $computer -Count 1 -quiet
if ($IsConnected)
$Message = \"Le poste répond.\"
Copy-Item -Path $location -Destination \"\\$computer\c$\destination\\" -Force -Recurse -ErrorAction stop
} else {
$Message = \"Le poste ne répond pas.\"
}
Write-output (New-Object -Type PSObject -Property @{
Hostname = $computer
IsConnected = $IsConnected
Message=$Message
})
[/code:1]
La propriété IsConnected permet de filtrer le résultat et Message de renseigner le texte à afficher.
Mais pour moi la propriété IsConnected porte déjà l'information, ceci peut être suffisant :
[code:1]
$IsConnected=Test-Connection -ComputerName $computer -Count 1 -quiet
if ($Connected)
{ Copy-Item -Path $location -Destination \"\\$computer\c$\destination\\" -Force -Recurse -ErrorAction stop }
Write-output (New-Object -Type PSObject -Property @{
Hostname = $computer
IsConnected = $IsConnected
})
[/code:1]
Filtrer le résultat :
[code:1]
$result=@(
New-Object -Type PSObject -Property @{
Hostname = 'computer1'
IsConnected = $true
}
New-Object -Type PSObject -Property @{
Hostname = 'computer2'
IsConnected = $false
}
)
$result|where-object {$_.isconnected}
# IsConnected Hostname
#
# True computer1
$result|where-object {-not $_.isconnected}
# IsConnected Hostname
#
# False computer2
[/code:1]
La présence de la propriété Message n'est nécessaire qu'une fois que tu construis un rapport
[code:1]
$Messages=@(
\"Le poste répond.\"
\"Le poste ne répond pas.\"
)
#Propriété calculée
$NewResult=$Result|
Select-object -Property HostName,@{Name='Message';e={$Messages[($_.IsConnected)]}}
$NewResult
# Hostname Message
#
# computer1 Le poste ne répond pas.
# computer2 Le poste répond.
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 4/04/18 12:16
Ton objet renseigne des donnés pour l'affichage et pas pour les possible traitements.Si d'après toi c'est mieux de renvoyer un objet de type booléen
[code:1]
$IsConnected=Test-Connection -ComputerName $computer -Count 1 -quiet
if ($IsConnected)
$Message = \"Le poste répond.\"
Copy-Item -Path $location -Destination \"\\$computer\c$\destination\\" -Force -Recurse -ErrorAction stop
} else {
$Message = \"Le poste ne répond pas.\"
}
Write-output (New-Object -Type PSObject -Property @{
Hostname = $computer
IsConnected = $IsConnected
Message=$Message
})
[/code:1]
La propriété IsConnected permet de filtrer le résultat et Message de renseigner le texte à afficher.
Mais pour moi la propriété IsConnected porte déjà l'information, ceci peut être suffisant :
[code:1]
$IsConnected=Test-Connection -ComputerName $computer -Count 1 -quiet
if ($Connected)
{ Copy-Item -Path $location -Destination \"\\$computer\c$\destination\\" -Force -Recurse -ErrorAction stop }
Write-output (New-Object -Type PSObject -Property @{
Hostname = $computer
IsConnected = $IsConnected
})
[/code:1]
Filtrer le résultat :
[code:1]
$result=@(
New-Object -Type PSObject -Property @{
Hostname = 'computer1'
IsConnected = $true
}
New-Object -Type PSObject -Property @{
Hostname = 'computer2'
IsConnected = $false
}
)
$result|where-object {$_.isconnected}
# IsConnected Hostname
#
# True computer1
$result|where-object {-not $_.isconnected}
# IsConnected Hostname
#
# False computer2
[/code:1]
La présence de la propriété Message n'est nécessaire qu'une fois que tu construis un rapport
[code:1]
$Messages=@(
\"Le poste répond.\"
\"Le poste ne répond pas.\"
)
#Propriété calculée
$NewResult=$Result|
Select-object -Property HostName,@{Name='Message';e={$Messages[($_.IsConnected)]}}
$NewResult
# Hostname Message
#
# computer1 Le poste ne répond pas.
# computer2 Le poste répond.
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 4/04/18 12:16
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.155 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- [Résolu] Accès à une variable dans un workflow