Аргумент, экранирующий неправильно интерпретируется при запуске сценария node.js из Windows PowerShell - PullRequest
2 голосов
/ 29 января 2020

С учетом следующего сценария:

const yargs = require('yargs');

const argv =
    yargs
        .usage('Usage: $0 [--whatIf]')
        .alias('d', 'directory')
        .alias('wi', 'whatIf')
        .nargs('d', 1)
        .describe('d', 'alphabetize this directory')
        .describe('whatIf', 'show what would happen if run')
        .demandOption(['d'])
        .argv;

console.log(argv.directory);

Если я вызову сценарий из Windows PowerShell примерно так: node .\alphabetizer.js -d 'l:\my folder\Files - Some Files In Here\' --whatIf Я получу вывод l:\my folder\Files - Some Files In Here\" --whatIf, где я ожидаю просто l:\my folder\Files - Some Files In Here\. Он работает нормально с именами папок, которые не требуют экранирования, но, похоже, он сбивается с толку из-за экранирования.

Если я проверю process.argv, я вижу ту же проблему с экранированием.

У меня есть заметил, что если я уберу завершающий sla sh, это сработает. Тем не менее, это все еще указывает на то, что скрипт узла не обрабатывает ввод должным образом, потому что в этом нет необходимости, если строка отключена одинарными кавычками.

Есть ли способ заставить эту работу работать?

1 Ответ

3 голосов
/ 29 января 2020

И Windows PowerShell (powershell.exe) и PowerShell [Core] v6 + (pwsh) в корне нарушены в отношении правильного цитирования аргументов для внешних программ - см. этот ответ для справочной информации.

Как правило, PowerShell на Windows должен выполнить повторное цитирование за кулисами , чтобы обеспечить только "..." - используется цитирование, учитывая, что внешние программы не могут понимать '...' -цитирование также при синтаксическом анализе их командной строки (что на Windows каждая программа должна делать сама).

Windows PowerShell - больше сломан относительно аргументов, которые заканчиваются на \ и , имеют встроенные пробелы , неправильно цитируя их; Например:

PS> foo.exe 'c:\foo \' bar

переводится за кулисы в следующую командную строку:

foo.exe "c:\ foo \" bar

Это неработающий , в большинстве приложений, включая PowerShell собственный CLI - разумно предположить, что \" является экранированным " char. дословно , думая, что аргумент продолжается с bar и затем неявно заканчивается, несмотря на формальное отсутствие закрытия ".

PowerShell [Core] v6 + более разумно переводит выше к foo.exe "c:\foo \\" bar, где \\ интерпретируется как экранированный \, а следующий " снова имеет функцию syntacti c.


Если вы застряли с Windows PowerShell , вы можете выбрать только:

  • либо: , если возможно , оставьте позади \
  • в противном случае : удваивает его вручную (\\), но делает это только в том случае, если аргумент также содержит пробелы (в противном случае \\ будет сохранен как есть, хотя в этом случае путей файловой системы, которые обычно доброкачественные).
...