как сделать дескриптор пакетного файла в именах файлов - PullRequest
1 голос
/ 29 июня 2019

У меня есть следующий пакетный файл, чтобы git diff вызывал интерфейс сравнения электронных таблиц в Windows. Поэтому я пытаюсь передать 2-й (старый файл) и 5-й (новый файл) аргументы git diff для сравнения электронных таблиц, чтобы он сравнивал файл с помощью git diff.

Так что теперь этот пакетный файл успешно обрабатывает только файлы без пробелов в именах файлов, он НЕ МОЖЕТ обрабатывать файлы с пробелами в именах файлов.

Какой код я должен добавить в этот скрипт, чтобы этот пакетный код обрабатывал файл с пробелами:

@ECHO OFF
set path2=%5
set path2=%path2:/=\%
ECHO %2 > tmp.txt
dir %path2% /B /S >> tmp.txt

C:/"Program Files"/"Microsoft Office"/root/vfs/ProgramFilesX86/"Microsoft Office"/Office16/DCF/SPREADSHEETCOMPARE.EXE tmp.txt

В настоящее время выдает следующие ошибки:

Unhandled Exception: System.ArgumentException: Illegal characters in path.
   at System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional)
   at System.IO.Path.GetFileName(String path)
   at ProdianceExcelCompare.Form1.StatusReady()
   at ProdianceExcelCompare.Form1.Init()
   at ProdianceExcelCompare.Form1..ctor(String instructionFile)
   at ProdianceExcelCompare.Program.Main(String[] args)
fatal: external diff died, stopping at London comparison.xlsx

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

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

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

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

0 голосов
/ 29 июня 2019

Проблема заключается в следующем:

не ставьте "в каждой папке имена с такими пробелами, как C: /" Program Files "/" 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»

только в начале диска: / путь как этот "диск: \ путь"

я надеюсь, что это решило вашу проблему и, кстати, извините за мой плохой английский: (* ​​1009 *

...