Виконання файлу EXE за допомогою сценарію PowerShell


111

Я намагаюся виконати файл EXE за допомогою сценарію PowerShell. Якщо я використовую командний рядок, він працює без проблем (спочатку надаю ім'я виконуваного файлу та ряд параметрів, щоб викликати його):

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

Але якщо зробити все те саме, що і всередині сценарію, повертається помилка:

Термін "" C: \ Файли програми \ Автоматизований QA \ TestExecute 8 \ Bin \ TestExecute.exe "C: \ temp \ TestProject1 \ TestProject1.pjs / run / exit / SilentMode" не визнається іменем командлета, функції , файл сценарію або операційна програма. Перевірте написання імені або якщо шлях включений, перевірте, чи правильний шлях, і спробуйте ще раз.

(Я викликав команду за допомогою оператора "&".)

Як я можу виправити цю проблему?


4
Опублікуйте свій код, будь ласка. Оскільки в цьому і полягає проблема, переглядати її набагато простіше, ніж здогадуватися.
Коді Грей

Відповіді:


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

або

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

ОНОВЛЕННЯ: вибачте, що пропустив "(я викликав команду, використовуючи речення" & "оператор)". У мене була ця проблема, коли я динамічно оцінював шлях. Спробуйте конструкцію Invoke-Expression:

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

Як не дивно, що команда в оригінальному питанні майже точно працює для мене на VM в PS2.0. Але ця сама команда зараз не працює в системі PS4.0. Цікаво, що я також телефоную TestExecute. Я думаю, що мені найбільше подобається варіант 2, я зіткнуся, дякую!
EJA

33

Схоже, ви вказуєте і EXE, і його перший аргумент в одній строці, наприклад; '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'. Це не спрацює. Як правило, ви викликаєте нативну команду, яка має пробіл на своєму шляху так:

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

Очікує, &що після нього слід рядок, який ідентифікує команду: cmdlet, функція, нативне відношення exe або абсолютний шлях.

Як тільки ви працюєте так:

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

Почніть працювати над цитуванням аргументів у міру необхідності. Хоча схоже, що ваші аргументи повинні бути просто чудовими (пробілів, жодних спеціальних символів, інтерпретованих PowerShell).


2
Чи все-таки потрібно виконати скрипт повноважень без повного шляху, якщо скрипт і exe знаходяться в одній папці? Або можливо використовувати відносний шлях?
guanome

7
Якщо exe знаходиться в одній папці, ви можете це зробити, .\foo.exeі ви також можете використовувати відносний шлях ..\..\foo.exeі відносний шлях з пробілами & '..\..\path with spaces\foo.exe'.
Кіт Хілл

Якщо у вас є труби у вашій команді , ніж ви повинні використовувати лапки: cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".
larkee

2

У Powershell перейдіть до файлу .exe. Наприклад:

cd C: \ Користувачі \ Адміністратори \ Завантаження

PS C: \ Користувачі \ Адміністратори \ Завантаження> & '. \ Aaa.exe'

Інсталятор вискакує та дотримуйтесь інструкцій на екрані.


саме те, що я хочу! запустіть .exe файл & '. \ aaa.exe'
Шаріф Яздян

2
  1. клон $ args
  2. підсуньте свої аргументи в новий масив
  3. & $ path $ args

Демонстрація:

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

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

& $exepath $myArgs

Thx @nodoccat, працював як шарм, щоб запустити команду docker з дуже довгим списком аргументів.
danidemi

1

Не будучи розробником, я знайшов рішення у виконанні декількох команд PS в одному рядку. Наприклад:

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

Поставивши "(подвійну лапочку) перед & (ampersand), він виконує виконуваний файл. У жодному із знайдених нами прикладів це не згадувалося. Без подвійних лапок PS-запит відкривається і чекає введення.


Привіт РічардЕ. Чи можете ви покращити форматування своєї відповіді? У режимі редагування надається допомога щодо форматування, погляньте на це.
Доріан Турба
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.