最初の投稿なので、私を傷つけないでください。私は周りを検索しましたが、私が望むことをする方法を見つけることができないようです。\$ computer\c $にある多数のコンピューターにフォルダーをコピーするスクリプトを作成しました。これらのフォルダーには、.exeを実行するバッチファイルがあります。私がやりたいのは、Powershellがフォルダーのコピーに使用したのと同じcomputers.txtからプルし、psexecを使用してバッチファイルを実行することです。私はこれをすべて手動で行うことができましたが、スクリプトを作成するのは問題のようです。
$computers = gc "C:\scripts\computers.txt"
foreach ($computer in $computers) {
if (test-Connection -Cn $computer -quiet) {
cd C:\pstools
psexec \\%computer cmd
C:\Folder\install.bat"
} else {
"$computer is not online"
}
}
では、上から見てみましょう。
$computers = gc "C:\scripts\computers.txt"
これにより、「computers.txt」ファイルの内容が変数$computers
にロードされます。簡単で、問題はありません。
次に、ForEachループがあります。 $computers
の内容を分割し、各行(おそらくコンピューターの名前)を中括弧内のすべてのコードに対して$computer
として処理します。
foreach ($computer in $computers) {
このループは、標準のIf-Thenステートメントで始まります。 (condition)
の場合、{do stuff}
です。この場合、$computer
がネットワーク上で使用可能かどうかをテストしています。存在する場合、PSExecを実行しようとします。オンラインでない場合は、Else句を実行します。すぐにそれを実行します。
if (test-Connection -Cn $computer -quiet) {
次に、ディレクトリを変更します。無意味ですが、何でもいいです。 C:\PSTools\PSExec.exe <arguments>
などのように明示的に呼び出して行を保存することもできますが、実際には問題はありません。
cd C:\pstools
次に、PSExecを呼び出しますが、ここには少し構文エラーがあります。 $computer
ではなく、%computer
である必要があります。また、実行するコマンドはcmd
ではなく、2行目にある必要があります。呼び出し演算子(&
)を使用して、コマンドレットや関数などを実行しないで何かを実行しようとしていることをpowershellに認識させると、より良い結果が得られる場合があります。
& psexec \\$computer C:\Folder\install.bat
その後、コンピューターがオンラインでない場合に「$ computer is not online」という文字列を書き込むElse句が続き、Else句とForEachループの中括弧が閉じます。
} else {
"$computer is not online"
}
}
編集: OK、完成したスクリプトは次のようになります(パスにスペースがある場合に備えて、ターゲットを引用符で囲みます)。
$computers = gc "C:\scripts\computers.txt"
foreach ($computer in $computers) {
if (test-Connection -Cn $computer -quiet) {
& C:\pstools\psexec.exe \\$computer "C:\folder\install.bat"
} else {
"$computer is not online"
}
}
この質問は2014年のものであり、この回答はユーザーが尋ねた質問に直接対応するものではないことを理解しています。しかし、最近この質問に出くわした人のために、PowerShellを使用している場合はPSExecを使用する必要はありませんを捨てたいと思います。既にPowerShellを使用しているため、Invoke-Command
。
構文は
Invoke-Command -ComputerName $Computer -ScriptBlock { C:\Folder\install.bat }
本当に簡単です。
*ターゲットサーバーでPowerShellリモート処理を有効にする必要があります。
これを試してみてください。 %
欲しい場所$
。また、cmd.exe呼び出しは不要です。
$computers = gc "C:\scripts\computers.txt"
foreach ($computer in $computers) {
if (test-Connection -Cn $computer -quiet) {
cd C:\pstools
psexec \\$computer "C:\Folder\install.bat"
} else {
"$computer is not online"
}
}
&(呼び出し)演算子、&psexec\$ computer "C:\ Folder\install.bat"を使用します