首页 > 解决方案 > 如何在文件名中制作批处理文件句柄空格

问题描述

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

标签: batch-fileargumentsfilenames

解决方案


请参阅 Stack Overflow 上的以下答案:

  1. 如何用空格设置环境变量?
    为什么在命令行上使用“set var = text”后没有带有“echo %var%”的字符串输出?
    他们解释了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目录中的文件扩展名,用于与名称无关的临时文件批处理文件的目录以及临时文件的目录路径是什么。

最后一个建议是阅读此答案以获取有关命令SETLOCALENDLOCAL的详细信息。

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


推荐阅读