Powershell cmd / c с двумя парами кавычек работает на Win 7, но не на Win 10 - PullRequest
0 голосов
/ 25 февраля 2019

Когда я запускаю эту команду Powershell, она работает на моем ПК с Windows 7, но не на моем компьютере с Windows 10, почему?

cmd /c "`"`"C:\Program Files (x86)\National Instruments\LabVIEW 2018\LabVIEW.exe`"`""

Ошибка

'""C:\Program' is not recognized as an internal or external command, operable program or batch file.

Команда

cmd /c "`"C:\Program Files (x86)\National Instruments\LabVIEW 2018\LabVIEW.exe`""

работает на обоих, но мне нужно добавить еще одну пару кавычек, потому что моя команда на самом деле содержит пути:

cmd /c "`"`"C:\Program Files (x86)\National Instruments\LabVIEW 2018\LabVIEW.exe`" `"$runner_File`" > `"$runnerResult_File`"`""

1 Ответ

0 голосов
/ 25 февраля 2019

Избегайте головной боли при цитировании :

  • , позволяя PowerShell обрабатывать вызов вашего консольного приложения напрямую
  • и эмулируя cmd.exe '> перенаправление с Set-Content -Encoding Oem:
& "C:\Program Files (x86)\National Instruments\LabVIEW 2018\LabVIEW.exe" $runner_File |
  Set-Content -Encoding Oem $runnerResult_File

Прочтите объяснение.

См. Нижний раздел, если вы хотите решить исходную проблемус cmd /c.


  • Обычно нет необходимости использовать cmd /c для вызова консольных приложений из PowerShell.

    • ТрубопроводSet-Content -Encoding Oem может использоваться для эмуляции перенаправления вывода cmd.exe >, хотя обратите внимание, что это может замедлить ход событий.

      • С положительной стороны, Set-Content позволяет вам control выходная кодировка.
    • Чтобы контролировать, какую кодировку символов PowerShell предполагает использовать в выходных данных консольного приложения, установите [Console]::OutputEncoding перед вызовом приложение.

    • Хотя вы можете использовать собственный PowerShell >, он будетсоздавать файлы UTF-16LE по умолчанию в Windows PowerShell (и файлы без UOM-8 UTF-8 в PowerShell Core ) - хотя в PSv5.1 + вы можете изменить кодировку, которую > использует через словарь предустановок $PSDefaultParameterValues.

  • Чтобы вызвать консольное приложение, путь которого должен заключаться в кавычки или предоставляется через переменную, используйте &,оператор вызова.

  • Если вы предоставляете аргументы через переменные (например, $runnerFile), PowerShell позаботится о цитировании значений переменных для вас, за кулисами, если это необходимо.


Решение проблемы с cmd /c:

Странно, Передача командной строки cmd /c, которая содержит множественные "..." -замкнутые аргументы дополнительно требует включения всей командной строки в "...".

Вот как этого добитьсяиз PowerShell, по:

  • помещению на бот индивидуально экранированных " экземпляров (`")h конец командной строки передается в cmd /c, который становится общим вмещающим "...".

  • , в противном случае полагаясь на собственное скрытое цитирование по требованию переменных в PowerShell по требованию.

cmd /c `" "C:\Program Files (x86)\National Instruments\LabVIEW 2018\LabVIEW.exe" $runner_File > $runnerResult_File `"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...