gpt4 book ai didi

batch-file - 如何使批处理文件处理文件名中的空格

转载 作者:行者123 更新时间:2023-12-04 13:41:08 29 4
gpt4 key购买 nike

我有以下批处理文件来制作 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 上的以下答案:

  • 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" 以及推荐此语法的原因。
  • 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,该临时文件的批处理文件的名称作为文件名和文件扩展名 .tmp 在目录中的临时文件独立于批处理文件的名称是什么,临时文件的目录路径是什么。
    最后一个建议是阅读 this answer 以了解有关命令 SETLOCAL ENDLOCAL 的详细信息。
    在到达批处理文件执行的导出点之前,还应最终删除临时文件。

    关于batch-file - 如何使批处理文件处理文件名中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56813356/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com