web-dev-qa-db-fra.com

Comment définir le paramètre nommé comme [ref] dans PowerShell

J'essaie d'utiliser [ref] paramètres nommés. Cependant, je reçois une erreur:

workflow Test
{
    Param([Parameter(Mandatory=$true)][String][ref]$someString)

    write-verbose $someString -Verbose
    $someString = "this is the new string"
}

cls
$someString = "hi"
Test -someString [ref]$someString
write-Host $someString

#Error: Cannot process argument transformation on parameter 'someString'. Reference type is expected in argument.

Comment puis-je résoudre ce problème?

18
Backwards_Dave

J'ai remarqué que vous utilisez un "workflow" dans votre exemple de paramètre [ref]. Par souci de simplicité, appelons-le une "fonction" et revenons plus tard au "workflow".

Il y a trois choses que vous devez changer dans votre code:

  1. Lorsque vous passez un paramètre [ref] à la fonction, vous devez mettre le paramètre entre parenthèses ().
  2. Lorsque vous utilisez un paramètre [ref] dans une fonction, reportez-vous à $ variable.value
  3. Supprimez le type [chaîne] de votre définition de paramètre. Il peut s'agir d'une [chaîne] ou d'une [référence], mais pas des deux.

Voici du code qui fonctionne:

function Test
{
    Param([Parameter(Mandatory=$true)][ref]$someString)

    write-verbose $someString.value -Verbose
    $someString.value = "this is the new string"
}
cls
$someString = "hi"
Test -someString ([ref]$someString)
write-Host $someString

Quant aux "workflows". Ils sont très restreints, lisez Flux de travail PowerShell: restrictions . En particulier, vous ne pouvez pas appeler une méthode sur un objet dans le flux de travail. Cela rompra la ligne:

$someString.value = "this is the new string"

Je ne pense pas que l'utilisation des paramètres [ref] dans un workflow soit pratique, en raison des restrictions de workflow.

30
Jan Chrbolka

J'ai senti que je devais écrire cette réponse très simpliste complémentaire car c'était le premier coup google lors de la recherche d'informations sur l'utilisation des paramètres de référence dans les fonctions Powershell. Bien que votre question ne concerne pas les fonctions mais les workflows:

Exemple d'utilisation de paramètres de référence dans les fonctions (ne fonctionne pas avec le workflow):

Function myFunction ([ref]$aString) { <br>
    $aString.Value = "newValue"; <br>
} <br>
$localVariable = "oldValue" <br>
Write-Host $localVariable # Outputs: oldValue <br>
myFunction ([ref]$localVariable); <br>
Write-Host $localVariable # Outputs: newValue <br>

Avec les fonctions, vous pouvez définir le paramètre comme étant à la fois une référence et un autre type, comme ceci (mais pas avec les workflows):

Function myFunction ([ref][string]$aString) { <br>
    $aString.Value = "newValue"; <br>
} <br>
$localVariable = "oldValue" <br>
Write-Host $localVariable # Outputs: oldValue <br>
myFunction ([ref]$localVariable); <br>
Write-Host $localVariable # Outputs: newValue <br>

Je suis d'accord avec Jan, vous ne devriez pas essayer d'utiliser des paramètres de référence dans les workflows en raison de restrictions de workflow (invocation de méthode sur les objets): https://blogs.technet.Microsoft.com/heyscriptingguy/2013/01/02/powershell-workflows-restrictions /

3
Jim Björklund