Wykonywanie pliku EXE przy użyciu skryptu PowerShell

111

Próbuję wykonać plik EXE przy użyciu skryptu PowerShell. Jeśli korzystam z wiersza poleceń to działa bez problemu (najpierw podaję nazwę pliku wykonywalnego i szereg parametrów, aby go wywołać):

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

Ale zrobienie dokładnie tego samego wewnątrz skryptu zwraca błąd:

Termin „C: \ Program Files \ Automated QA \ TestExecute 8 \ Bin \ TestExecute.exe” C: \ temp \ TestProject1 \ TestProject1.pjs / run / exit / SilentMode nie jest rozpoznawany jako nazwa cmdletu , funkcji , plik skryptu lub działający program. Sprawdź pisownię nazwy lub, jeśli ścieżka została dołączona, sprawdź, czy jest ona poprawna i spróbuj ponownie.

(Wywołałem polecenie, używając operatora „&”.)

Jak mogę rozwiązać ten problem?

eden
źródło
4
Prześlij swój kod, proszę. Ponieważ na tym polega problem, przyjrzenie się temu jest znacznie łatwiejsze niż zgadywanie.
Cody Grey

Odpowiedzi:

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

lub

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

AKTUALIZACJA: przepraszam, że przegapiłem zdanie "(wywołałem polecenie, używając operatora" & ")". Miałem ten problem, gdy dynamicznie oceniałem ścieżkę. Wypróbuj konstrukcję Invoke-Expression:

Invoke-Expression "& `"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe`" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode"
Tomas Panik
źródło
Dziwne, że polecenie z pierwotnego pytania prawie dokładnie działa dla mnie na maszynie wirtualnej w PS2.0. Ale to samo polecenie nie działa teraz w systemie PS4.0. Co ciekawe, dzwonię również do TestExecute. Myślę, że najbardziej podoba mi się opcja 2, dam temu szansę, dzięki!
EJA
33

Wygląda na to, że określasz zarówno plik EXE, jak i jego pierwszy argument w jednym ciągu, np.; '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'. To nie zadziała. Ogólnie rzecz biorąc, wywołujesz natywne polecenie, które ma spację na swojej ścieżce:

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

Oznacza to &oczekuje, że będzie następnie ciąg, który identyfikuje polecenie: cmdlet, funkcja, rodzimych exe ścieżkę względną lub bezwzględną.

Gdy już to działa:

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

W razie potrzeby rozpocznij pracę nad cytowaniem argumentów. Chociaż wygląda na to, że twoje argumenty powinny być w porządku (bez spacji, żadnych innych znaków specjalnych interpretowanych przez PowerShell).

Keith Hill
źródło
2
Czy istnieje możliwość wykonania skryptu PowerShell bez pełnej ścieżki, jeśli skrypt i plik exe znajdują się w tym samym folderze? Czy można użyć ścieżki względnej?
guanome
7
Jeśli plik exe znajduje się w tym samym folderze, możesz to zrobić .\foo.exei możesz również użyć ścieżki względnej ..\..\foo.exei ścieżki względnej ze spacjami & '..\..\path with spaces\foo.exe'.
Keith Hill
Gdy masz rur w swojej komendzie niż należy użyć cytatów: cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".
larkee
2

W programie PowerShell przejdź do lokalizacji pliku .exe. Na przykład:

cd C: \ Users \ Administrators \ Downloads

PS C: \ Users \ Administrators \ Downloads> & '. \ Aaa.exe'

Pojawi się instalator i postępuj zgodnie z instrukcjami wyświetlanymi na ekranie.

losowa osoba
źródło
dokładnie to, czego chcę! uruchom plik .exe & „. \ aaa.exe”
Sharif Yazdian
2
  1. clone $ args
  2. umieść swoje argumenty w nowej tablicy
  3. & $ ścieżka $ args

Próbny:

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

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

& $exepath $myArgs
NoDocCat
źródło
Thx @nodoccat, działał jak urok, uruchamiając polecenie dockera z bardzo długą listą argumentów.
danidemi
1

Nie będąc programistą, znalazłem rozwiązanie polegające na uruchamianiu wielu poleceń ps w jednej linii. Na przykład:

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

Umieszczając "(podwójny cudzysłów) przed & (ampersand)" uruchamia plik wykonywalny. W żadnym z przykładów, które nie znalazłem, nie było o tym wspominane. Bez podwójnych cudzysłowów otwiera się zachęta ps i czeka na wejście.

RichardE
źródło
Cześć RichardE. Czy możesz poprawić formatowanie swojej odpowiedzi? W trybie edycji dostępna jest pomoc dotycząca formatowania, spójrz na nią.
Dorian Turba