Как выполнить EXE-файл в PowerShell с параметрами с пробелами и кавычками

Если вы собираетесь использовать пути в стиле Unix, вам нужен начальный слеш, поэтому путь к файлу должен быть следующим: "/C/Users/LENOVO/Desktop/Brats18_2013_1_1_t1.nii/"

[111 ] Или вы можете использовать пути в стиле Windows, тогда это будет: "c: \ Users \ LENOVO \ Desktop \ Brats18_2013_1_1_t1.nii"

310
задан Peter Mortensen 11 July 2015 в 13:18
поделиться

2 ответа

Cmd может обработать выполнение заключенного в кавычки exe, но Powershell не может. Я просто собираюсь иметь дело с выполнением самого exe, так как у меня нет его. Если буквально необходимо отправить doublequotes в аргумент внешней команды, это - другая проблема, это было покрыто в другом месте.

1) одинарная левая кавычка пробелы:

C:\Program` Files\IIS\Microsoft` Web` Deploy\msdeploy.exe

2) добавляют exe папку к Вашему пути, возможно, в Вашем $profile

$env:path += ';C:\Program Files\IIS\Microsoft Web Deploy\'
msdeploy
0
ответ дан 23 November 2019 в 01:12
поделиться

Когда PowerShell видит команду, начинающуюся со строки, он просто оценивает строку, то есть обычно выводит ее на экран, например:

PS> "Hello World"
Hello World

Если вы хотите, чтобы PowerShell интерпретировал строку в качестве имени команды используйте оператор вызова (&), например:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

После этого вам, вероятно, нужно будет заключить в кавычки только пары параметр / аргумент, содержащие пробелы и / или символы кавычек. Когда вы вызываете такой EXE-файл со сложными аргументами командной строки, обычно очень полезно иметь инструмент, который покажет вам, как PowerShell отправляет аргументы в EXE-файл. Такой инструмент есть в PowerShell Community Extensions . Это называется эхолокацией. Вы просто заменяете EXE-файл на echoargs - оставляя все аргументы на месте, и он покажет вам, как EXE-файл получит аргументы, например:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

Используя echoargs, вы можете экспериментировать, пока не добьетесь нужного результата, например:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

Оказывается, раньше я слишком старался сохранить двойные кавычки вокруг строки подключения. Очевидно, в этом нет необходимости, потому что даже cmd.exe удалит их.

Кстати, снимаю шляпу перед командой PowerShell. Они очень помогли мне показать особые заклинания одинарных и двойных кавычек, чтобы получить желаемый результат - если вам нужно сохранить внутренние двойные кавычки на месте. :-) Они также понимают, что это проблемная область, но их движет количество людей, затронутых той или иной проблемой. Если вас это беспокоит, проголосуйте за это сообщение об ошибке PowerShell .

Для получения дополнительной информации о том, как PowerShell анализирует, ознакомьтесь с моей серией блогов Эффективный PowerShell - особенно пункт 10 - «Понимание режимов синтаксического анализа PowerShell»

ОБНОВЛЕНИЕ 4/4/2012: С этой ситуацией намного проще справиться в PowerShell V3. Подробнее см. сообщение в блоге .

324
ответ дан 23 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: