0

私のスクリプトから、リモートの Windows ボックスでコマンドを実行したいと考えています。だから私は少しグーグルで調べましたが、それを行うための最も一般的で何とか標準的な方法は、と同じプロトコルを使用していると思われるPowerShellのコマンドInvoke-Commandレットを使用することです. したがって、以下はスクリプトから呼び出そうとしたコマンドです(実際には、他の多くの変更も試しましたが、IMOは問題を説明するのに十分です):winrmwinrs

  1. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {<fullcommand>};"

  2. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {Start-Process -FilePath <fullexepath> -ArgumentList <arguments> -Wait -NoNewWindow};"

  3. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass;$session=new-PSSession -ComputerName "REMOTE_COMPUTER_NAME" -Credential $cred; Invoke-Command -Session $session -ScriptBlock {<fullcommand>};"

注: スクリプトは で書かれてperlいますが、IMO ここではスクリプトの言語は問題ではないため、スクリプトからコマンドを呼び出すと想定できます。コマンドはbatchスクリプトから実行する必要があるため、インタラクティブな操作は必要ないことに注意してください。行動。

したがって、これらのコマンドにはいくつかの問題があり、それらを理解するための助けが必要です。どうぞ:

  1. タイプ のプロセスを実行できませんconfigure and run daemonconfigure_server.plつまり、リモート ボックス ( <fullcommand> = "configure_server.pl <arguments>") で実行したい場合、これは何かを実行する必要があります。実行するとすぐに、デーモンとして実行されるはずの を含む完全なリモート ジョブが強制終了server.exeされるため、動作しません。(ポイント 1、2、3 に適用)configure_server.plserver.exe
  2. 折り返し (各行の長さが 80 文字以下) の標準出力と標準エラーを取得します。(ポイント 1、3 に適用)
  3. 標準出力と標準エラーを取得しません。(ポイント 2 に適用)
4

1 に答える 1

0

ふぅ、これは難しい問題です。あなたの種類はいたるところにあるので、あなたがしようとしていることを完全に見逃したら、私に知らせてください。

1. 遠い道を行くのはやめましょう。素晴らしいアイデアのように思えますが、そうではありません。プロセスを持続させる唯一の方法は、ホスト コンピューターで PowerShell ウィンドウを開いておくことです。お気づきかもしれませんが、プロセスを正常に作成できますが、それらは powershell.exe の子であり、クライアント コンピューターの wsmprovhost.exe プロセスによってホストされます。親がいなくなると、すべての子供が殺されます

これを修正するには、コマンド ライン機能を使用することをお勧めします: Schtasks.exe
schtasks.exe /create /sc ONCE /tn $taskName /tr $command /s $serverName /u $userName /p $pass /ru $userName /rp $pass /st $startTime

このコマンドは、スケジュールされたタスクを作成して一度実行し、その後それ自体を削除します。コンピューター名も取得するため、リモート アクセスは必要ありません。schtasks.exe /delete を実行する前に、schtasks.exe /query を実行して実行中の「ステータス」を確認することもできます。

2.
` (バッククォート) を使用して、powershell 3で次の行にキャリー実行を指定します。この関数で標準出力とエラーを取得します。大きなスクリプトで実行すると出力されないことがありますが、常に $? を使用できます。エラーをキャプチャします。

注: このコマンドに PSCredentials を渡すことはできません。安全な文字列に変換せずに、ユーザー名とパスワードの入力を求めるだけの GUI を作成することをお勧めします。私は自分のスクリプトでリモート処理を避けるようにしています。選択の余地がない場合もありますが、この場合は選択できると思います。

于 2013-07-23T19:36:03.127 に答える