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

У меня есть следующий пакетный файл, чтобы 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  

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

  1. Как установить переменные среды с помощью пробелов?
    Почему не выводится строка с ‘echo% var%’ после использования ‘set var = text’ в командной строке?
    Они объясняют рекомендуемый синтаксис set "VariableName = variable value" для определения переменной среды и причин, по которым рекомендуется использовать этот синтаксис.
  2. Почему команда 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 .

Временный файл также должен быть окончательно удален до достижения точки выхода для выполнения пакетного файла.


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

  1. Как установить переменные среды с пробелами?
    Почему не выводится строка с ‘echo% var%’ после использования ‘ set var = text ‘в командной строке?
    Они объясняют рекомендуемый синтаксис set "VariableName = variable value" для определения переменной среды и причины, по которым рекомендуется этот синтаксис.
  2. Почему команда 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 «

только в начале диска:/путь, например» диск: путь »

Надеюсь, это решило вашу проблему, и, кстати, извините за мой плохой английский 🙁

Оцените статью
techsly.ru
Добавить комментарий