У меня есть следующий пакетный файл, чтобы git diff
вызывать пользовательский интерфейс сравнения электронных таблиц в Windows. Итак, я пытаюсь передать аргументы git diff 2-й (старый файл) и 5-й (новый файл) для сравнения электронной таблицы, чтобы он мог сравнить файл с помощью git diff.
Итак, теперь этот командный файл успешно обрабатывает только файлы без пробелов в именах файлов, он НЕ МОЖЕТ обрабатывать файлы с пробелами в именах файлов.
Какой код я должен добавить в этот скрипт, чтобы этот пакетный код обрабатывал файл с пробелами:
@ECHO OFFset path2 =% 5set path2 = % path2:/= % ECHO% 2> tmp.txtdir% path2%/B/S >> tmp.txtC:/"Program Files"/"Microsoft Office"/root/vfs/ProgramFilesX86/"Microsoft Office"/Office16 /DCF/SPREADSHEETCOMPARE.EXE tmp.txt
В настоящее время он вызывает такие ошибки:
Необработанное исключение : System.ArgumentException: недопустимые символы в пути. в System.IO.Path.CheckInvalidPathChars (строковый путь, логическое checkAdditional) в System.IO.Path.GetFileName (строковый путь) в ProdianceExcelCompare.Form1.StatusReady () в ProdianceExcelCompare.Form1.Init () в ProdianceExcelCompare.Form1..ctor (StringstructionFile) в ProdianceExcelCompare.Program.Main (String [] args) фатальный: внешний diff умер, остановка в London compare.xlsx
См. следующие ответы о переполнении стека:
- Как установить переменные среды с помощью пробелов?
Почему не выводится строка с ‘echo% var%’ после использования ‘set var = text’ в командной строке?
Они объясняют рекомендуемый синтаксисset "VariableName = variable value"
для определения переменной среды и причин, по которым рекомендуется использовать этот синтаксис. - Почему команда ECHO выводит в файл лишний конечный пробел?
Это объясняет, почему пробел оставлен оператору перенаправления>
в ECHO командная строка также записывается в файл как конечный пробел и как этого избежать в переменном тексте, записанном в файл.
См. также документацию Microsoft об использовании операторов перенаправления команд.
В других командных строках, кроме ECHO , пробел, оставленный до>
, обычно не является проблемой.
В общем случае использовать несколько раз "
в строке аргумента, такой как путь к файлу или папке. Должен быть только один "
в начале и один "
в конце. Это объясняется с помощью вывода командного процессора Windows на последней странице справки при запуске в окне командной строки cmd/?
.
Документация Microsoft по именованию файлов, Пути и пространства имен объясняют, что разделителем каталогов в Windows является , а не/, и поэтому /
не следует использовать в пакетных файлах в Windows в путях к файлам/папкам..
В выводе справки при запуске в окне командной строки call/?
объясняется, как можно ссылаться на аргументы командного файла и с какими модификаторами.
Код, переписанный в соответствии с информацией, опубликованной выше и на указанных страницах:
@echo offsetlocal EnableExtensions DisableDelayedExpansionset "path2 =% ~ 5" set "path2 =% путь2:/= % ">" tmp.txt "echo% 2dir"% 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
даже для второго аргумента, переданного пакетному файлу, является «Привет и добро пожаловать!»
:
@echo offsetlocal EnableExte nsions DisableDelayedExpansionset "path2 =% ~ 5" set "path2 =% path2:/= %" set "Argument2 =% ~ 2" setlocal EnableDelayedExpansionecho! 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
нельзя использовать, поскольку он не работает для чего-то вроде «Привет и добро пожаловать!»
. Командный процессор Windows интерпретирует первую строку, разделенную обычным пробелом, горизонтальной табуляцией, запятой, знаком равенства или неразрывным пробелом (в кодовых страницах OEM), разделенную строку после &
как команду или приложение для выполнить, как описано в одной строке с несколькими командами с использованием пакетного файла Windows.
"tmp.txt"
можно было бы записать везде в обоих пакетных файлах также с помощью всего лишь tmp.txt
. Но никогда не ошибается заключать полную строку аргументов файла/папки в двойные кавычки, даже если это не является действительно необходимым, потому что строка не содержит пробела или одного из этих символов & () [] {} ^ =;! '+, `~
. Поэтому рекомендуется всегда заключать полную строку аргументов файла/папки в двойные кавычки. Например, выполнение замены в обоих пакетных файлах, поиск tmp.txt
и использование в качестве строки замены % TEMP% % ~ n0.tmp
приведет к использованию вместо tmp.txt
в текущем каталоге временный файл с именем командного файла в качестве имени файла и расширением файла .tmp
в каталоге для временных файлов независимо от того, что — это имя командного файла и путь к каталогу для временных файлов.
Последнее предложение — прочитать этот ответ для получения подробной информации о командах SETLOCAL и ENDLOCAL .
Временный файл также должен быть окончательно удален до достижения точки выхода для выполнения пакетного файла.
См. Следующие ответы о переполнении стека:
- Как установить переменные среды с пробелами?
Почему не выводится строка с ‘echo% var%’ после использования ‘ set var = text ‘в командной строке?
Они объясняют рекомендуемый синтаксисset "VariableName = variable value"
для определения переменной среды и причины, по которым рекомендуется этот синтаксис. - Почему команда ECHO печатает лишний конечный пробел в файле?
Это объясняет, почему пробел оставлен для оператора перенаправления>
в Командная строка ECHO также записывается в файл как конечные s темп и способы безопасного предотвращения этого в переменном тексте, записанном в файл.
См. также документацию Microsoft об использовании операторов перенаправления команд.
В других командных строках, кроме ECHO пробел, оставленный до>
, обычно не является проблемой.
В целом неправильно использовать несколько раз "
внутри строки аргумента, такой как путь к файлу или папке. Должен быть только один "
в начале и один "
в конце. Это объясняется выводом командного процессора Windows на последней странице справки при запуске в окне командной строки cmd/?
.
Документация Microsoft по именованию файлов, Пути и пространства имен объясняют, что разделителем каталогов в Windows является , а не/, поэтому /
не следует использовать в пакетных файлах в Windows в путях к файлам/папкам.
Вывод справки при запуске в окне командной строки call/?
объясняет, как можно ссылаться на аргументы командного файла с какими модификаторами.
Код переписано в соответствии с информацией, опубликованной выше и на указанных страницах:
@echo offsetlocal EnableExtensions DisableDelayedExpansionset "path2 =% ~ 5" set "path2 =% path2:/= %" > "tmp.txt" echo% 2dir "% 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
, даже если вторым аргументом, переданным в пакетный файл, является «Привет и добро пожаловать!»
:
@echo offsetlocal EnableExtensions DisableDelayedExpansionset "path2 =% ~ 5" set "path2 =% path2:/= %" set "Argument2 =% ~ 2" setlocal EnableDelayedExpansionecho! 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
нельзя использовать как неработающий для чего-то вроде «Привет и добро пожаловать!»
. Командный процессор Windows интерпретирует первую строку, разделенную обычным пробелом, горизонтальной табуляцией, запятой, знаком равенства или неразрывным пробелом (в кодовых страницах OEM), разделенную строку после &
как команду или приложение для выполнить, как описано в одной строке с несколькими командами с использованием пакетного файла Windows.
"tmp.txt"
можно было бы записать везде в обоих пакетных файлах также с помощью всего лишь tmp.txt
. Но никогда не ошибается заключать полную строку аргументов файла/папки в двойные кавычки, даже если это не является действительно необходимым, потому что строка не содержит пробела или одного из этих символов & () [] {} ^ =;! '+, `~
. Поэтому рекомендуется всегда заключать полную строку аргументов файла/папки в двойные кавычки. Например, выполнение замены в обоих пакетных файлах, поиск tmp.txt
и использование в качестве строки замены % TEMP% % ~ n0.tmp
приведет к использованию вместо tmp.txt
в текущем каталоге временный файл с именем командного файла в качестве имени файла и расширением файла .tmp
в каталоге для временных файлов независимо от того, что — это имя командного файла и путь к каталогу для временных файлов.
Последнее предложение — прочитать этот ответ для получения подробной информации о командах SETLOCAL и ENDLOCAL .
Временный файл также должен быть окончательно удален до достижения точки выхода для выполнения пакетного файла.
Проблема заключается в следующем:
не ставьте «в имена каждой папки с такими пробелами, как этот C:/» Program Files » /»Microsoft Office»/root/vfs/ProgramFilesX86/»Microsoft Office»/Office16/DCF/SPREADSHEETCOMPARE.EXE
вместо этого напишите так: «C:/Program Fi файлы/Microsoft Office/root/vfs/ProgramFilesX86/Microsoft Office/Office16/DCF/SPREADSHEETCOMPARE. EXE «
только в начале диска:/путь, как этот» диск: путь «
Я надеюсь, что это устранило вашу проблему и, кстати, извините за мои плохой английский 🙁
Проблема:
не ставьте «в имена каждой папки с такими пробелами, как это C:/»Program Files»/»Microsoft Office»/root/vfs/ProgramFilesX86/»Microsoft Office»/Office16/DCF/SPREADSHEETCOMPARE.EXE
вместо этого напишите так: «C:/Program Файлы/Microsoft Office/root/vfs/ProgramFilesX86/Microsoft Office/Office16/DCF/SPREADSHEETCOMPARE.EXE «
только в начале диска:/путь, например» диск: путь »
Надеюсь, это решило вашу проблему, и, кстати, извините за мой плохой английский 🙁