Question [Résolu] Accès à une variable dans un workflow

Plus d'informations
il y a 3 ans 5 mois #25236 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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 ans 5 mois #25245 par Arnaud Petitjean
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

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.

Plus d'informations
il y a 3 ans 5 mois #25247 par DALLAVALLE Rémy
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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 ans 5 mois #25251 par Laurent Dardenne
Salut,
je ne rencontre pas de pb avec ton code (PS v5.1 Seven) :
[code:1]
workflow parallelPingCOmputer {
Param($computers,
$location)

Write-Warning \&quot;Location WF : $location\&quot;
foreach -parallel($computer in $computers)
{
Write-Warning \&quot;Location // : $location\&quot;
$ping = $null
If (Test-Connection -ComputerName $computer -Count 1 -quiet) {

$ping = \&quot;Le poste répond\&quot;
Copy-Item -Path $location -Destination \&quot;\\$computer\c$\destination\\&quot; -Force -Recurse -ErrorAction stop

} else {

$ping = \&quot;Le poste ne répond pas\&quot;

}

Write-output (New-Object -Type PSObject -Property @{
Hostname = $computer
Ping = $ping
})
}
Write-Warning \&quot;Fin \&quot;
}

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.

Plus d'informations
il y a 3 ans 5 mois #25254 par DALLAVALLE Rémy
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.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 ans 5 mois #25255 par Laurent Dardenne
Neandril écrit:

Si d'après toi c'est mieux de renvoyer un objet de type booléen

Ton objet renseigne des donnés pour l'affichage et pas pour les possible traitements.
[code:1]
$IsConnected=Test-Connection -ComputerName $computer -Count 1 -quiet
if ($IsConnected)
$Message = \&quot;Le poste répond.\&quot;
Copy-Item -Path $location -Destination \&quot;\\$computer\c$\destination\\&quot; -Force -Recurse -ErrorAction stop
} else {
$Message = \&quot;Le poste ne répond pas.\&quot;
}

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 \&quot;\\$computer\c$\destination\\&quot; -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=@(
\&quot;Le poste répond.\&quot;
\&quot;Le poste ne répond pas.\&quot;
)

#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.081 secondes
Propulsé par Kunena