2016-11-29 11 views
0

これらの2つを動作させようとしましたが、エラーが発生し続けます。基本的には、拡張子.txtのC:\ Temp \ Testのすべてのファイルをピックアップし、Server1とServer2 D:\ Temp \ Testにコピーします。パラメータ 'Path'に引数をバインドすることができません。nullであり、パスを見つけることができません。

動作しません...

$servers = "Server1","Server2" 
$SourcePath = (Get-ChildItem C:\Temp\Test *.txt).Name 
$servers | ForEach { 
Invoke-Command $servers -ScriptBlock { 
$CompName = (Get-WmiObject -Class Win32_ComputerSystem).Name 
$DestPath = "\\$CompName\D$\Temp\Test" 
Copy-Item $SourcePath -Destination $DestPath -Recurse 
} 
} 
+0

ヒント: '$ servers | ForEach {"a server = $ _"; $ servers} 'となります。さらに、スクリプトが例外をスローした場合、メッセージとスタックトレースの両方を含む例外を含むようにスクリプトを編集してください。 "*うまくいきません..." *演奏は十分ではありません! – JosefZ

+0

[Invoke-Commandでリモートマシン上で実行されるスクリプトブロックにローカル変数を渡すにはどうすればよいですか?](http://stackoverflow.com/questions/35492437/how-can-i-pass-a-リモートマシン上で実行されるローカル変数からスクリプトブロックまでのブロック) – PetSerAl

答えて

1

は、これは実際によくある間違いです。 Invoke-Commandを使用してリモートサーバーでスクリプトブロックを呼び出すと、そのリモートコンピュータにPowerShellの新しいインスタンスが作成されます。 PowerShellの新しいインスタンスは、その新しいインスタンスに決して設定されていないので、変数が何であるか分かりません。この問題を回避するには、scriptblockにパラメータを指定し、scriptblockを呼び出すときに$SourcePathの値を指定します。これは次のようにすることができます:

$servers = "Server1","Server2" 
$SourcePath = (Get-ChildItem C:\Temp\Test *.txt).Name 
$servers | ForEach { 
    Invoke-Command $servers -ScriptBlock { 
     Param($SourcePath) 
     $CompName = (Get-WmiObject -Class Win32_ComputerSystem).Name 
     $DestPath = "\\$CompName\D$\Temp\Test" 
     Copy-Item $SourcePath -Destination $DestPath -Recurse 
    } -ArgumentList $SourcePath 
} 
関連する問題