web-dev-qa-db-ja.com

PowerShellは、リモートコンピュータ上でコマンドライン引数を使用してリモートexeファイルを実行します

いろいろ調べてさまざまなコマンドを試しましたが、まだそこにいません。

私の目標は、リモートマシンに既に存在するexeを実行し、コマンドライン引数を渡すことです。 invoke-commandを試しましたが、引数を認識する構文を取得できないようです。

試した方法:

  1. Win32_Process.Create()
  2. 呼び出しコマンド
  3. 開始プロセス
  4. [diagnostics.process] :: start
  5. Invoke-WmiMethod

私のテストから、私が得ることができる最も近いものは次のコマンドです:

$command = "program.exe -r param"
Invoke-Command -ComputerName $server -ScriptBlock {$command}

コマンドはエラーや戻りコードなしで完了しますが、リモートマシンでは引数を指定して実行されませんでした。単一引用符または二重引用符をいじって、変更がないかどうかを確認しましたが、変更はありません。

20
gregs

-ArgumentListパラメーターを使用してみましたか:

invoke-command -ComputerName studio -ScriptBlock { param ( $myarg ) ping.exe $myarg } -ArgumentList localhost   

http://technet.Microsoft.com/en-us/library/dd347578.aspx

パスになく、フォルダーパスにスペースがあるプログラムを呼び出す例:

invoke-command -ComputerName Computer1 -ScriptBlock { param ($myarg) & 'C:\Program Files\program.exe' -something $myarg } -ArgumentList "myArgValue"

引数の値が静的な場合は、次のようにスクリプトブロックで指定できます。

invoke-command -ComputerName Computer1 -ScriptBlock { & 'C:\Program Files\program.exe' -something "myArgValue" } 
23
Andy Arismendi

起動するプログラムにコマンドライン引数を渡そうとしていますか?私は今まさにこれを行う何かに取り組んでおり、思っていたよりもずっと簡単でした。コマンドラインに移動して、次のように入力すると

C:\folder\app.exe/xC:\folder\file.txt

その後、アプリケーションが起動し、指定されたディレクトリに指定された名前でファイルが作成されます。

リモートマシンでPowershellスクリプトを使用してこれを実行したかったため、必要なのは

$s = New-PSSession -computername NAME -credential LOGIN
    Invoke-Command -session $s -scriptblock {C:\folder\app.exe /xC:\folder\file.txt}
Remove-PSSession $s

(セッション内に同様のコマンドがたくさんありますが、これは実行に必要な最小限のものです)実行可能ファイルとコマンドライン引数の間のスペースに注意してくださいそれは私にとってはうまくいきますが、私はアプリケーションがどのように動作するのか、またはそれが引数を渡す方法であるかどうかは正確にはわかりません。

*スクリプトブロックを次のように変更して、アプリケーションに自分のローカルコンピューターにファイルをプッシュバックさせることもできます。

C:\folder\app.exe /x"\\LocalPC\DATA (C)\localfolder\localfile.txt"

ファイルパスにスペースが含まれている場合は、引用符が必要です。

編集:実際、これはPowershellがサービスまたは何かとしてアプリケーションを起動することでいくつかの愚かな問題を引き起こしたので、いくつかの検索を行い、CMDを呼び出してリモートコンピューターでコマンドを実行できることがわかりました。これにより、リモートマシンのCMDウィンドウに入力したように、コマンドが正確に実行されます。スクリプトブロック内のコマンドを二重引用符で囲み、cmd.exe/Cをその前に置きます。このような:

cmd.exe /C "C:\folder\app.exe/xC:\folder\file.txt"

これは私が最近抱えていたすべての問題を解決しました。

編集編集:より多くの問題があり、それを行うためのより良い方法を見つけました。

start-process -filepath C:\folder\app.exe -argumentlist "/xC:\folder\file.txt"

これにより、リモートプロセスが終了するのを待つターミナルウィンドウがハングアップすることはありません。プロセスがそれ自体で終了しない場合は、プロセスを終了する方法があることを確認してください。 (私のものではありません、別の引数のコーディングが必要です)

4
Kyle Gagnon

私は1行の単一エントリを使用してこれを達成しようとしましたが、セッションを開始して終了する前に十分に待機している場合は動作する可能性があるにもかかわらず、起動直後にプロセスを強制終了するため、Invokeコマンドは正常に動作しませんでした。

たとえば、リモートマシンHFVMACHINE1(Windows 7を実行中)で引数とスペースを指定してコマンドを実行するために見つけることができる唯一の作業方法は次のとおりです。

([WMICLASS]"\\HFVMACHINE1\ROOT\CIMV2:win32_process").Create('c:\Program Files (x86)\Thinware\vBackup\vBackup.exe -v HFSVR12-WWW')
1
P. Lion