【问题标题】:how to make batch file handle spaces in file names如何在文件名中制作批处理文件句柄空格
【发布时间】:2019-11-10 19:02:03
【问题描述】:

我有以下批处理文件可以让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

【问题讨论】:

  • 当你发送参数时,那些带有毒或空格字符的参数需要双引号。在您的批处理文件中,如果您不再需要周围的双引号,您可以使用%~5 而不是%5 来删除它们。此外,set 命令的推荐语法是Set "VariableName=VariableValue"。因此,我建议您在上面的脚本中使用以下内容,Set "path2=%~5",以删除周围的双引号,或者 Set "path2=%5",如果您愿意保留它们。
  • 标准的 Windows 路径分隔符是 \ ,但不是 /(尽管由于一些智能自动更正,一些命令可能同时接受)!

标签: batch-file arguments filenames


【解决方案1】:

在 Stack Overflow 上查看以下答案:

  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 上的文件/文件夹路径中的批处理文件中使用。

在命令提示符窗口中运行的帮助输出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 代码页中)分隔的第一个字符串解释为要执行的命令或应用程序,如single line with multiple commands using Windows batch file 所述.

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

最后的建议是阅读this answer 以了解有关命令 SETLOCALENDLOCAL 的详细信息。

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

【讨论】:

    【解决方案2】:

    问题是:

    不要在每个带有空格的文件夹名称上加上 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"

    我希望这能解决你的问题,顺便说一句对不起我的英语不好:(

    【讨论】:

    • 您发布的内容已包含在现有答案中如果您决定回答以前回答的问题,最好发布一些独特的内容。
    猜你喜欢
    • 2016-02-01
    • 2011-06-15
    • 1970-01-01
    • 2013-12-17
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多