Пробелы в аргументах пакетного скрипта - PullRequest
2 голосов
/ 05 августа 2010

У меня есть пакетный скрипт, который должен выполнить действие с каждым из его аргументов. Каждый аргумент является именем файла (здесь нет переключателей), и, конечно, имена файлов могут содержать пробелы. Пакетный скрипт запускается либо путем перетаскивания файлов на значок .bat в проводнике, либо путем ввода файлов в командной строке, заключая аргументы с пробелами в кавычки.

В пакетном скрипте есть проблемы с обработкой аргументов с пробелами. Если я использую %* следующим образом, кавычки игнорируются, и каждое «слово» между пробелами рассматривается как аргумент.

for %%x in (%*) do (
    echo %%x
)

Я также пытался использовать shift, который, похоже, тоже не работает, задыхаясь от файлов с пробелами в их имени:

:next
if not %1 == "" (
    echo %1

    shift /1
    goto next
)

Каков идеальный способ перебора всех аргументов?

В Bash можно было бы просто использовать "$@" и все, что только работает & trade ;, но, конечно, это не относится к пакетным сценариям Windows.

Ответы [ 3 ]

2 голосов
/ 05 августа 2010

Модификаторы подстановки для для ссылок на переменные также позволяют использовать расширения ~.См. для ссылки на команду .

Используя "%%~x", вы должны получить правильно заключенный в кавычки параметр, аналогично тому, как bash обрабатывает "$@".

@echo off

setlocal enableextensions

for %%x in (%*) do (
    echo "%%~x"
)

Символы, а также ;может использоваться для разделения параметров команды.См. Обзор командной оболочки .Таким образом, вы должны заключать в кавычки имена файлов, содержащие эти символы.

Если вы перетащите файл из Проводника на .bat, Проводник будет правильно заключать в кавычки файл, только если в его пути есть пробел.,Например, D:\a,b,c.exe не будет заключен в кавычки Explorer и, следовательно, будет проанализирован как три отдельных аргумента cmd.exe.

Чтобы заставить скрипт работать с перетаскиванием из Проводника для этих странных случаев, вы можетеиспользуйте следующий (уродливый) обходной путь:

@echo off

setlocal enableextensions enabledelayedexpansion

set "args=%*"
set "args=%args:,=:comma:%"
set "args=%args:;=:semicolon:%"

for %%x in (%args%) do (
    set "filepath=%%~x"
    set "filepath=!filepath::comma:=,!"
    set "filepath=!filepath::semicolon:=;!"
    echo "!filepath!"
)

Сценарий вводит вспомогательную переменную args, где каждое вхождение проблемного символа заменяется заполнителем (обратите внимание, что сам символ двоеточия не может бытьиспользуется в имени файла в Windows).

В теле цикла for используется другая вспомогательная переменная filepath, которая отменяет преобразование для получения исходного пути.

0 голосов
/ 12 декабря 2014

У меня была похожая проблема с именами файлов, которые содержат знаки равенства (=), в результате чего имя файла разделялось на несколько аргументов.Я решил это, используя "%*".

Если у вас есть файл с пробелами, например, foo bar baz.txt, это будет указано дважды: ""foo bar baz.txt"".Теперь двойные двойные кавычки экранируются: foo bar baz.txt, в результате чего %1 = foo, %2 = bar и %3 = baz.txt.Так что это не работает.

Если у вас есть файл с пробелами и / или знаками равенства, вы можете использовать:

set input=""%*""
set input=%input:"=%
your_program "%input%"

Теперь foo bar=baz.txt будет заключено в кавычки трижды: """foo bar=baz.txt""".Две кавычки будут экранированы и input станет "foo bar=baz.txt".Во второй строке двойные кавычки заменяются ничем (удаляется).Вам нужно снова поставить кавычки вокруг input, когда вы введете его в your_program, иначе он будет видеть пробелы как отдельный ввод!

Если у вас есть только знаки равенства, то ""%*"" делает foo=bar=baz.txtв ""foo=bar=baz.txt"", который входит в вашу программу как %1 = foo=bar=baz.txt.

0 голосов
/ 17 августа 2010

Я создал пакетную «функцию», которая выполняет «правильный» анализ аргументов и правильно обрабатывает знаки равенства и точки с запятой. Я думаю, вы обнаружите, что это может помочь вам решить эти проблемы. Полную информацию и пример можно найти на моем сайте: http://skypher.com/index.php/2010/08/17/batch-command-line-arguments/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...