web-dev-qa-db-ja.com

PowerShellを介してリモートサーバーでバッチスクリプトを実行する

接続後、クライアント(サーバーと同じドメイン)からいくつかのリモートサーバーに接続する必要があります。バッチファイルを実行する必要があります。

私はこのコードでそうしました:

$Username = 'USER'
$Password = 'PASSWORD'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass

try {
    Invoke-Command -ComputerName "SERVER1" -Credential $Cred -ScriptBlock -ErrorAction Stop {
        Start-Process "C:\Users\nithi.sundar\Desktop\Test.bat"
    }
} catch {
    Write-Host "error"
}

このスクリプトではエラーは発生しませんが、バッチスクリプトを実行しているようには見えません。

これについてのご意見をお待ちしております。

4
Stephen Sugumar

交換してみてください

invoke-command -computername "SERVER1" -credential $Cred -ScriptBlock -ErrorAction stop { Start-Process "C:\Users\nithi.sundar\Desktop\Test.bat" }

Invoke-Command -ComputerName "Server1" -credential $cred -ErrorAction Stop -ScriptBlock {Invoke-Expression -Command:"cmd.exe /c 'C:\Users\nithi.sund
ar\Desktop\Test.bat'"}
5
Nick Eagle

Invoke-Commandへの引数の順序をめちゃくちゃにしたため、投稿したコードがエラーなしで実行された可能性はありません。この:

Invoke-Command ... -ScriptBlock -ErrorAction Stop { ... }

実際には次のようになります。

Invoke-Command ... -ErrorAction Stop -ScriptBlock { ... }

また、しないでくださいこれにはInvoke-Expressionを使用します。それは 実際には常に間違ったツール であり、あなたが達成する必要があるものは何でもです。 PowerShellはバッチスクリプトを直接実行できるため、Start-Processも必要ありません。

Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
    C:\Users\nithi.sundar\Desktop\Test.bat
} -Credential $Cred -ErrorAction Stop

ただし、コマンドが単語ではなく文字列の場合は、 call operator を使用する必要があります。

Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
    & "C:\Users\nithi.sundar\Desktop\Test.bat"
} -Credential $Cred -ErrorAction Stop

cmd.exeを使用してバッチファイルを呼び出すこともできます。

Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
    cmd /c "C:\Users\nithi.sundar\Desktop\Test.bat"
} -Credential $Cred -ErrorAction Stop

何らかの理由でStart-Processを使用する必要がある場合は、パラメータ-NoNewWindowおよび-Waitを追加する必要があります。

Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
    Start-Process 'C:\Users\nithi.sundar\Desktop\Test.bat' -NoNewWindow -Wait
} -Credential $Cred -ErrorAction Stop

デフォルトでは、Start-Processは、呼び出されたプロセスを非同期で(つまり、呼び出しはすぐに戻ります)、別のウィンドウで実行します。これが、コードが意図したとおりに機能しなかった理由であると考えられます。

0
Ansgar Wiechers