如何在文件名中使批处理文件句柄空间

时间:2019-06-28 21:29:35

标签: batch-file filenames

我具有以下批处理文件,以使git diff在Windows中调用电子表格比较UI。因此,我试图将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 个答案:

答案 0 :(得分:2)

有关堆栈溢出,请参见以下答案:

  1. How to set environment variables with spaces?
    Why is no string output with 'echo %var%' after using 'set var = text' on command line?
    他们解释了用于定义环境变量的推荐语法set "VariableName=variable value"以及推荐此语法的原因。
  2. Why does ECHO command print some extra trailing space into the file?
    解释了为什么在 ECHO 命令行上留给重定向操作符>的空格字符也作为尾随空格写入到文件中的原因,以及如何在写入文件的可变文本中安全地避免这种情况。
    另请参阅有关Using command redirection operators的Microsoft文档。
    ECHO 以外的其他命令行上,>留一个空格通常没问题。

在文件或文件夹路径之类的参数字符串中多次使用"通常是错误的。开头应该只有一个",结尾应该只有一个"。在命令提示符窗口cmd /?中运行时,最后一个帮助页面上的Windows命令处理器输出将对此进行解释。

关于Naming Files, Paths, and Namespaces的Microsoft文档解释说Windows上的目录分隔符是\而不是/,因此/不应在Windows的批处理文件中使用file /文件夹路径。

在命令提示符窗口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代码页中)分隔的第一个字符串解释为命令或应用程序,以执行{ {3}}。

"tmp.txt"可以只用tmp.txt写在两个批处理文件中的任何地方。但是,即使在没有必要的情况下,也可以使用双引号将完整的文件/文件夹参数字符串括起来,因为该字符串不包含空格或这些字符之一&()[]{}^=;!'+,`~,这是绝对正确的。因此,最好始终将完整的文件/文件夹参数字符串用双引号引起来。例如,在两个搜索tmp.txt的批处理文件上运行替换并使用替换字符串%TEMP%\%~n0.tmp作为替换字符串,将导致在当前目录中使用临时文件而不是tmp.txt来命名批处理文件作为文件临时文件的目录名和文件扩展名.tmp,与批处理文件的名称以及临时文件的目录路径无关。

最后的建议是阅读single line with multiple commands using Windows batch file,以获取有关命令 SETLOCAL ENDLOCAL 的详细信息。

在到达执行批处理文件的退出点之前,还应该最后删除临时文件。

答案 1 :(得分:-1)

问题是:

不要在每个文件夹名称上都带有“ 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”

仅在drive:/ path的开头,例如“ drive:\ path”

我希望这能解决您的问题,并为我的英语不好对不起:(