2016-07-27 4 views
1

私が作業している以下のコードがあります。問題はありますが、可変メッセージをコンピュータに送信することはできません。それは私がそれで達成しようとしていたものではありません。変数がリモートセッションに送信されない

Function Send-PopupMessage { 
    #Requires -Version 2.0 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory = $true)] 
     [String]$ComputerName, 
     [Parameter(Mandatory = $true)] 
     [String]$Message 
    ) 

    Invoke-Command -ComputerName $ComputerName -Scriptblock { 
     $CmdMessage = "msg.exe * $Message" 
     Write-Host $CmdMessage 
     $CmdMessage | Invoke-Expression 
    } 
} 

私はPSWAを使用して、別のコンピュータへのセッションで私はこのことから、別のセッションを開始することはできませんよいますので、これはquestion linkedと同じではありません。また、私はより多くの私はまだ他のコンピュータに送信されてcmdが代わりに

msg.exe *「」 であることと同じ結果を取得しています「重複」問題の1のようになり、私のコードを変更しても、 msg.exe * 'Test Message'

+0

つまり、 '$ Message'の_local_定義を参照するために' $ using:Message'を使用してください。 – mklement0

答えて

1

PowerShellスクリプトブロックは、デフォルトでは字句解析クロージャではありません。 Invoke-Commandに渡されたスクリプトブロックは、他のコンピュータで実行されたときに$Messageパラメータの現在の値を保存しません。

ブロックがリモートセッションで実行されるとき、ブロックはそのセッションで現在値$Messageを使用しています。その変数はおそらく$nullであるため、メッセージはコマンドから除外されます。

$Messageの値を取得するには、$using:variableの構文described in this questionを使用します。

Invoke-Command -ComputerName $ComputerName -Scriptblock { 
    $CmdMessage = "msg.exe * $using:Message" 
    Write-Host $CmdMessage 
    $CmdMessage | Invoke-Expression 
} 

$using:variable構文は、リモートコンピュータでブロックを呼び出すときにのみ機能します。ローカル実行のためにスクリプトブロック内の変数をキャプチャする必要がある場合は、代わりにGetNewClosure()をScriptBlockに呼び出します。

$Message = "Hey there." 
$closure = { 
    $CmdMessage = "msg.exe * $Message" 
    Write-Host $CmdMessage 
    $CmdMessage | Invoke-Expression 
}.GetNewClosure() 

$Message = $null 
Invoke-Command -Scriptblock $closure 
+0

あなたの説明は正しいが、私はあなたのソリューションが動作しているとは思わない:あなたのローカルマシンがリモーティングのために設定されていると仮定して、次のコマンドを対比させてください(最後のものだけを対照してください): '$ foo = 'bar'; icm-computername。 {$ foo} 'と' $ foo = 'bar'; icm-computername。 {$ foo} .GetNewClosure() 'と' $ foo = 'bar'; icm-computername。 {$ using:foo} ' – mklement0

+0

リモート呼び出しのためのAFAIK' Invoke-Command'は、 'ScriptBlock'が接続されているモジュールを無視しますので、' GetNewClosure() 'は無用です。 – PetSerAl

+1

'$ using:var'構文を含めるように答えを編集しましたが、これはおそらくこれを二重にすることに同意します。ありがとう@mklement0 –

関連する問題