Esecuzione di un file EXE utilizzando uno script PowerShell


111

Sto cercando di eseguire un file EXE utilizzando uno script PowerShell. Se utilizzo la riga di comando funziona senza problemi (prima fornisco il nome dell'eseguibile e la serie di parametri per richiamarlo):

"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

Ma fare la stessa identica cosa all'interno di uno script restituisce un errore:

Il termine "C: \ Program Files \ Automated QA \ TestExecute 8 \ Bin \ TestExecute.exe" C: \ temp \ TestProject1 \ TestProject1.pjs / run / exit / SilentMode ' non è riconosciuto come nome di un cmdlet, funzione , file di script o programma eseguibile. Controlla l'ortografia del nome o, se è stato incluso un percorso, verifica che il percorso sia corretto e riprova.

(Ho invocato il comando utilizzando l'operatore "&".)

Come posso risolvere questo problema?


4
Pubblica il tuo codice, per favore. Dal momento che è qui che sta il problema, averlo da guardare è molto più facile che indovinare.
Cody Grey

Risposte:


122
& "C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

o

[System.Diagnostics.Process]::Start("C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe", "C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode")

AGGIORNAMENTO: scusa mi sono perso "(ho invocato il comando utilizzando la frase" & ")". Ho riscontrato questo problema durante la valutazione dinamica del percorso. Prova la costruzione Invoke-Expression:

Invoke-Expression "& `"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe`" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode"

Strano che il comando nella domanda originale, quasi esattamente, funzioni per me su una VM in PS2.0. Ma lo stesso comando ora fallisce sul sistema PS4.0. È interessante notare che sto chiamando anche TestExecute. Penso che l'opzione 2 mi piaccia di più, ci proverò, grazie!
EJA

33

Sembra che tu stia specificando sia l'EXE che il suo primo argomento in una singola stringa, ad esempio; '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'. Questo non funzionerà. In generale si richiama un comando nativo che ha uno spazio nel suo percorso in questo modo:

& "c:\some path with spaces\foo.exe" <arguments go here>

Si &prevede che sia seguito da una stringa che identifica un comando: cmdlet, funzione, percorso relativo o assoluto exe nativo.

Una volta ottenuto questo funzionamento:

& "c:\some path with spaces\foo.exe"

Inizia a lavorare sulla citazione degli argomenti, se necessario. Anche se sembra che i tuoi argomenti dovrebbero andare bene (niente spazi, nessun altro carattere speciale interpretato da PowerShell).


2
C'è comunque da eseguire lo script PowerShell senza il percorso completo, se lo script e l'exe si trovano nella stessa cartella? Oppure è possibile utilizzare un percorso relativo?
guanome

7
Se l'exe si trova nella stessa cartella, puoi farlo .\foo.exee puoi anche usare un percorso relativo ..\..\foo.exee un percorso relativo con spazi & '..\..\path with spaces\foo.exe'.
Keith Hill,

Quando si dispone di tubi nel comando di quanto deve usare le virgolette: cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".
larkee

2

In Powershell, accedi al percorso del file .exe. Per esempio:

cd C: \ Users \ Administrators \ Downloads

PS C: \ Users \ Administrators \ Download> & ". \ Aaa.exe"

Il programma di installazione si apre e segui le istruzioni sullo schermo.


esattamente quello che voglio! esegui un file .exe & ". \ aaa.exe"
Sharif Yazdian il

2
  1. clone $ args
  2. spingere i tuoi argomenti in un nuovo array
  3. & $ percorso $ args

demo:

$exePath = $env:NGINX_HOME + '/nginx.exe'
$myArgs = $args.Clone()

$myArgs += '-p'
$myArgs += $env:NGINX_HOME

& $exepath $myArgs

Grazie a @nodoccat, ha funzionato a meraviglia per avviare un comando docker con un elenco molto lungo di argomenti.
danidemi

1

Non essendo uno sviluppatore ho trovato una soluzione eseguendo più comandi ps in una riga. Per esempio:

powershell "& 'c:\path with spaces\to\executable.exe' -arguments ; second command ; etc

Inserendo un "(virgolette doppie) prima della & (e commerciale) esegue l'eseguibile. In nessuno degli esempi ho trovato che questo è stato menzionato. Senza le virgolette il prompt di ps si apre e attende l'input.


Ciao RichardE. Puoi migliorare la formattazione della tua risposta? In modalità di modifica, viene fornito un aiuto per la formattazione, dai un'occhiata.
Dorian Turba il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.