batch-file - 如何在文件名中制作批处理文件句柄空格
问题描述
我有以下批处理文件可以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
解决方案
请参阅 Stack Overflow 上的以下答案:
- 如何用空格设置环境变量?
为什么在命令行上使用“set var = text”后没有带有“echo %var%”的字符串输出?
他们解释了set "VariableName=variable value"
定义环境变量的推荐语法以及推荐这种语法的原因。 - 为什么 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的详细信息。
在到达批处理文件执行的退出点之前,也应该最终删除临时文件。
推荐阅读
- flutter - 我怎样才能实现这个TextField?
- java - JAVA,根据添加的月份输入正确的日期
- django - 呈现表单时忽略 Django 选择字段初始值
- ios - xcode - 将登录屏幕输入链接到网站输入
- ruby-on-rails - application.js 中定义的函数不起作用
- javascript - 从按钮调用函数时未捕获的 TypeError
- localhost - 本地主机在浏览器中打开特定文件而不是 www 目录
- python - Model.predict 延迟实时相机图像
- c - 实际上是什么 while(character !='\n'); 这 \n 语法的含义是什么?
- python - 使用正则表达式提取问题和答案