2012-03-02 13 views
15

Ho cercato dappertutto e ho provato diverse varianti di comandi, ma non ci sono ancora.Powershell Eseguire exe remoto con argomenti della riga di comando sul computer remoto

Il mio obiettivo è eseguire un exe che già risiede su una macchina remota e passare argomenti in riga di comando. Ho provato invoke-command, ma non riesco a ottenere la sintassi per riconoscere gli argomenti.

metodi provati:

  1. Win32_Process.Create()
  2. Invoke-Command
  3. avvio del processo
  4. [diagnostics.process] :: avviare
  5. Invoke-WmiMethod

Dai miei test, il più vicino che posso ottenere è con il seguente comando:

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

Il comando viene completato senza errori o codice di ritorno, ma sul computer remoto non è stato eseguito con argomenti. Ho giocato con virgolette singole/doppie per vedere se qualche cambiamento, ma nessuno.

risposta

19

Hai provato utilizzando il parametro -ArgumentList:

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

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

Un esempio di invocare un programma che non è nel percorso e dispone di uno spazio nel suo percorso di cartella:

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

Se il valore dell'argomento è statico, è sufficiente fornirlo nel blocco di script come questo:

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

Grazie per la risposta rapida. Per qualche ragione, quando provo in questo modo, ottengo che stampi il comando espanso che funzionerebbe se lo avessi eseguito manualmente, ma in realtà non lo sta eseguendo. Ho dovuto rimuovere il "&" come diceva che era un carattere riservato per uso futuro. – gregs

+0

@gregs Ho dovuto abilitare i servizi remoti sulla mia macchina per testare. Ho cambiato il comando in un semplice test ping inviando un argomento di localhost. Quanto sopra è successo per me. –

+0

Probabilmente ho capito il blocco, ma non la soluzione. Questa linea funziona se uso ping.exe e "localhost" come arg, ma devo mettere le virgolette sul mio percorso eseguibile poiché il percorso ha spazi. Quando lo faccio, semplicemente riecheggia la mia stringa tra virgolette, ma non credo che funzioni. – gregs

-2
$sb = ScriptBlock::Create("$command") 
Invoke-Command -ScriptBlock $sb 

Questo dovrebbe funzionare e non indurre in errore i principianti.

3

Si sta tentando di passare gli argomenti della riga di comando al programma AS come lo si avvia? Sto lavorando a qualcosa in questo momento che fa esattamente questo, ed è stato molto più semplice di quanto pensassi. Se vado nella riga di comando e digitare

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

poi i miei lanci di applicazione, e crea un file nella directory specificata con il nome specificato.

ho voluto fare questo attraverso uno script PowerShell su una macchina remota, e capito che tutto quello che dovevo fare era mettere

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

(Ho un sacco comandi simili all'interno della sessione, questo è solo il minimo necessario per eseguire) notare lo spazio tra l'eseguibile e gli argomenti della riga di comando. Funziona per me, ma non sono sicuro di come funziona la tua applicazione, o se è così anche come si passano gli argomenti ad essa.

* Posso anche avere la mia domanda spingere il file indietro al mio computer locale, modificando lo script-blocco

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

è necessario le virgolette se il file-path ha uno spazio in esso.

EDIT: in realtà, questo ha sollevato alcuni problemi stupidi con Powershell che avviava l'applicazione come servizio o qualcosa del genere, quindi ho fatto qualche ricerca, e ho capito che è possibile chiamare CMD per eseguire comandi per te sul computer remoto. In questo modo, il comando viene eseguito ESATTAMENTE come se fosse stato appena digitato in una finestra CMD sulla macchina remota. Metti il ​​comando nello scriptblock tra virgolette doppie e poi metti un cmd.exe/C prima di esso. Così:

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

questo ha risolto tutti i problemi che ho avuto recentemente.

MODIFICA MODIFICA: Aveva più problemi e ha trovato un modo molto migliore per farlo.

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

e questo non si blocca la vostra finestra di terminale in attesa del processo remoto per terminare. Assicurati solo di avere un modo per terminare il processo se non lo fa da solo. (il mio no, ha richiesto la codifica di un altro argomento)

+0

La migliore risposta ancora –

-1
$sb = [scriptblock]::create($command) 
+2

Benvenuti in StackOverflow! Forse potresti aggiungere qualche spiegazione, potrebbe essere utile per la persona che ha posto la domanda. –

Problemi correlati