См. Следующие ответы по переполнению стека:
- Как установить переменные окружения с пробелами?
Почему не выводится строка с 'echo% var%' после использования 'set var = text' в командной строке?
Они объясняют рекомендуемый синтаксис set "VariableName=variable value"
для определения переменной среды и причины, рекомендующие этот синтаксис.
- Почему команда ECHO печатает дополнительное свободное место в файле?
Это объясняет, почему символ пробела, оставленный оператору перенаправления >
в командной строке ECHO , также записывается в файл как конечный пробел, и как избежать этого безопасно в переменном тексте, записанном в файл.
См. Также документацию Microsoft о Использование операторов перенаправления команд .
В других командных строках, кроме ECHO пробел, оставленный до >
, обычно не вызывает проблем.
В общем случае неправильно использовать несколько раз "
в строке аргумента, такой как путь к файлу или папке. Должен быть только один "
в начале и один "
в конце. Это объясняется с помощью вывода командного процессора Windows на последней странице справки при запуске в окне командной строки cmd /?
.
Документация Microsoft о Именовании файлов, путей и пространств имен объясняет, что разделитель каталогов в Windows равен \ , а не / и поэтому /
должен нельзя использовать в пакетных файлах в Windows в путях к файлам / папкам.
Вывод справки при запуске в окне командной строки call /?
объясняет, как с какими модификаторами можно ссылаться на аргументы пакетного файла.
Код переписан в соответствии с информацией, размещенной выше и на ссылочных страницах:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "path2=%~5"
set "path2=%path2:/=\%"
>"tmp.txt" echo %2
dir "%path2%" /B /S >>"tmp.txt" 2>nul
"%ProgramFiles%\Microsoft Office\root\vfs\ProgramFilesX86\Microsoft Office\Office16\DCF\SPREADSHEETCOMPARE.EXE" "tmp.txt"
endlocal
Первая строка в tmp.txt
содержит второй аргумент, переданный в пакетный файл, то есть без или с двойными кавычками.
Следующий код необходим для безопасной записи второго аргумента всегда без "
в файл tmp.txt
даже для второго аргумента, передаваемого в пакетный файл: "Hello & welcome!"
:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "path2=%~5"
set "path2=%path2:/=\%"
set "Argument2=%~2"
setlocal EnableDelayedExpansion
echo !Argument2!>"tmp.txt"
endlocal
dir "%path2%" /B /S >>"tmp.txt" 2>nul
"%ProgramFiles%\Microsoft Office\root\vfs\ProgramFilesX86\Microsoft Office\Office16\DCF\SPREADSHEETCOMPARE.EXE" "tmp.txt"
endlocal
>tmp.txt echo %~2
нельзя использовать как не работающий для чего-то вроде "Hello & welcome!"
. Командный процессор Windows будет интерпретировать первую строку, разделенную обычным пробелом, горизонтальной табуляцией, запятой, знаком равенства или пробелом без пробелов (в кодовых страницах OEM) после &
, как команду или приложение для выполнения, как описано в одна строка с несколькими командами, использующими пакетный файл Windows .
"tmp.txt"
можно записать везде в обоих пакетных файлах, используя всего tmp.txt
. Но никогда нельзя ошибочно заключать полную строку аргумента файла / папки в двойные кавычки, даже если в этом нет необходимости, поскольку строка не содержит пробела или одного из этих символов &()[]{}^=;!'+,`~
. Поэтому рекомендуется всегда заключать полную строку аргумента файла / папки в двойные кавычки. Например, выполнение замены в обоих пакетных файлах с поиском tmp.txt
и использование в качестве замены строки %TEMP%\%~n0.tmp
приведет к использованию вместо tmp.txt
в текущем каталоге временного файла с именем пакетного файла в качестве имени файла и расширением файла .tmp
в каталоге для временных файлов независимо от того, как называется пакетный файл и каков путь к каталогу для временных файлов.
Последним предложением является чтение этого ответа для получения подробной информации о командах SETLOCAL и ENDLOCAL .
Временный файл также должен быть окончательно удален до достижения точки выхода для выполнения пакетного файла.