web-dev-qa-db-ja.com

PowerShellで名前付きパラメーターを[参照]として定義する方法

[ref]という名前のパラメーターを使用しようとしています。しかし、エラーが発生しています:

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.

この問題を修正するにはどうすればよいですか?

18
Backwards_Dave

[ref]パラメーターの例で「ワークフロー」を使用していることに気付きました。簡単にするために、これを「関数」と呼び、後で「ワークフロー」に戻りましょう。

コードで変更する必要があるものは3つあります。

  1. [ref]パラメーターを関数に渡すときは、パラメーターを括弧()で囲む必要があります。
  2. 関数内で[ref]パラメーターを使用する場合は、$ variable.valueを参照してください
  3. パラメーター定義から[string]タイプを削除します。 [string]または[ref]を指定できますが、両方を指定することはできません。

動作するコードは次のとおりです。

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

「ワークフロー」について。それらは非常に制限されています- PowerShellワークフロー:制限 を読んでください。特に、ワ​​ークフロー内のオブジェクトのメソッドを呼び出すことはできません。これは行を壊します:

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

ワークフローの制限のため、ワークフローで[ref]パラメーターを使用することは実用的ではないと思います。

30
Jan Chrbolka

これは、Powershell関数の参照パラメーターの使用に関する情報を検索するときの最初のGoogleヒットであったため、この補完的な非常に単純な答えを書く必要があると感じました。あなたの質問は機能ではなくワークフローに関するものでしたが:

関数で参照パラメーターを使用する例(ワークフローでは機能しません):

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>

関数を使用すると、次のようにパラメーターを参照と別のタイプの両方に定義できます(ただし、ワークフローでは定義できません)。

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>

Janに同意します。ワークフローの制限(オブジェクトのメソッド呼び出し)のために、ワークフローで参照パラメーターを使用しようとしてはいけません: https://blogs.technet.Microsoft.com/heyscriptingguy/2013/01/02/powershell-workflows-restrictions /

3
Jim Björklund