Batch file 转义字符串变量中的空格

Batch file 转义字符串变量中的空格,batch-file,Batch File,所以我有上面的批处理脚本。问题是,当我打印出当前_校验和的值时,文件目录被截断,而不是回显 @echo off setlocal enableextensions enabledelayedexpansion set CHECKSUM_TOOL=fciv.exe set DESTINATION_DIR=C:\Documents and Settings\Users\Desktop\testfolder set CHECKSUM=12345 set APP_NAME=price set VERI

所以我有上面的批处理脚本。问题是,当我打印出当前_校验和的值时,文件目录被截断,而不是回显

@echo off
setlocal enableextensions enabledelayedexpansion

set CHECKSUM_TOOL=fciv.exe
set DESTINATION_DIR=C:\Documents and Settings\Users\Desktop\testfolder
set CHECKSUM=12345
set APP_NAME=price
set VERIFY_FILE=testfile.txt

for /f "tokens=1" %%m in ('call "%CHECKSUM_TOOL%" -md5 
"%DESTINATION_DIR%\!VERIFY_FILE!"') do (
      for /f "tokens=1 delims=/ " %%n in ("%%m") do (
        set CURRENT_CHECKSUM="%%n"
        if not !CURRENT_CHECKSUM!==!CHECKSUM! (
          echo %DATE% %TIME% [ERROR] %~nx0: Checksum of existing file !CURRENT_CHECKSUM! does not match manifest !CHECKSUM! for %APP_NAME%
          REM exit 1
        )
      )
    )
相反,我得到了

C:\Documents and Settings\Users\Desktop\testfolder\testfile.txt
输出到fciv调用返回

c:\documents
请尝试使用
进行设置:

请尝试使用
进行设置:


对此有几种解决方案,但我现在将向您展示最通用的解决方案,如果您确实想要删除第一个令牌,它将起作用:

@echo关闭
setlocal EnableDelayedExpansion
设置“校验和工具=fciv.exe”
设置“DESTINATION\u DIR=C:\Documents and Settings\Users\Desktop\testfolder”
设置“校验和=12345”
设置“应用程序名称=价格”
设置“VERIFY_FILE=testfile.txt”
rem循环以获取第一个令牌,以便稍后进行减法:
对于/F“delims=“%%A IN('调用“%CHECKSUM\u TOOL%”-md5”%DESTINATION\u DIR%\%VERIFY\u FILE%”)执行以下操作(
设置“输出=%%A”
对于“%%A”中的/F“令牌=1”%%B,请执行以下操作(
将“令牌\u设置为\u减法=%%B”
)
)
设置“预期输出=!输出:%token\u to\u substract%=!"
回显由于您的自定义原因而要获取的字符串是:%expected\u output%
一个较短但不太普遍的解决方案是:

@echo关闭
设置“校验和工具=fciv.exe”
设置“DESTINATION\u DIR=C:\Documents and Settings\Users\Desktop\testfolder”
设置“校验和=12345”
设置“应用程序名称=价格”
设置“VERIFY_FILE=testfile.txt”
对于/F“tokens=2 delims=:”%%A IN('调用“%CHECKSUM\u TOOL%”-md5“%DESTINATION\u DIR%\%VERIFY\u FILE%”)do(
设置“预期输出=c:%%A”
)
回显由于您的自定义原因而要获取的字符串是:%expected\u output%
也可以将/F的最后一个
循环替换为以下循环,并具有相同的about含义:

for/F“tokens=2 delims=\”%%A IN('调用“%CHECKSUM\u TOOL%”-md5“%DESTINATION\u DIR%\%VERIFY\u FILE%”)do(
设置“预期输出=c:\%%A”
)
回显由于您的自定义原因而要获取的字符串是:%expected\u output%

它的功能完全相同(与上一个不同之处是1字节
:)

有几种解决方案,但现在我将向您展示最通用的解决方案,如果您确实要删除第一个令牌,它将起作用:

@echo关闭
setlocal EnableDelayedExpansion
设置“校验和工具=fciv.exe”
设置“DESTINATION\u DIR=C:\Documents and Settings\Users\Desktop\testfolder”
设置“校验和=12345”
设置“应用程序名称=价格”
设置“VERIFY_FILE=testfile.txt”
rem循环以获取第一个令牌,以便稍后进行减法:
对于/F“delims=“%%A IN('调用“%CHECKSUM\u TOOL%”-md5”%DESTINATION\u DIR%\%VERIFY\u FILE%”)执行以下操作(
设置“输出=%%A”
对于“%%A”中的/F“令牌=1”%%B,请执行以下操作(
将“令牌\u设置为\u减法=%%B”
)
)
设置“预期输出=!输出:%token\u to\u substract%=!"
回显由于您的自定义原因而要获取的字符串是:%expected\u output%
一个较短但不太普遍的解决方案是:

@echo关闭
设置“校验和工具=fciv.exe”
设置“DESTINATION\u DIR=C:\Documents and Settings\Users\Desktop\testfolder”
设置“校验和=12345”
设置“应用程序名称=价格”
设置“VERIFY_FILE=testfile.txt”
对于/F“tokens=2 delims=:”%%A IN('调用“%CHECKSUM\u TOOL%”-md5“%DESTINATION\u DIR%\%VERIFY\u FILE%”)do(
设置“预期输出=c:%%A”
)
回显由于您的自定义原因而要获取的字符串是:%expected\u output%
也可以将/F
的最后一个
循环替换为以下循环,并具有相同的about含义:

for/F“tokens=2 delims=\”%%A IN('调用“%CHECKSUM\u TOOL%”-md5“%DESTINATION\u DIR%\%VERIFY\u FILE%”)do(
设置“预期输出=c:\%%A”
)
回显由于您的自定义原因而要获取的字符串是:%expected\u output%

它的功能完全相同(与上一个不同的是1字节
:)

实际上,我无法复制您描述的输出,因为我在回显
时获得了文件的(引用的)校验和!当前校验和,但不是您描述的部分文件路径

无论如何,我相信您为/F
选项定义的
是错误的;您需要像
tokens=1*
这样的东西,因此您将得到两个令牌,它们由第一个(序列)空格分隔,第二个令牌甚至可能自己包含空格。顺便说一下,对于/F
循环,不需要使用两个
,一个就足够了

下面是我对固定代码的建议:

@echo关闭
setlocal EnableExtensions EnableDelayedExpansion
设置“校验和工具=fciv.exe”
设置“DESTINATION\u DIR=C:\Documents and Settings\Users\Desktop\testfolder”
设置“校验和=12345”
设置“应用程序名称=价格”
设置“VERIFY_FILE=testfile.txt”
对于/F“令牌=1*”%%M in('
“%CHECKSUM\u TOOL%”-md5“%DESTINATION\u DIR%\%VERIFY\u FILE%”
“)如果不是“%%M”==%CHECKSUM%”,则执行此操作(
echo!DATE!!TIME![错误]]~nx0:现有文件%%N的校验和%%M与%APP\u NAME%的清单%Checksum%不匹配
rem出口/B 1
)
端部
退出/B
这就是我所做的:

  • 一个
    用于/F
    循环,并应用适当的选项
  • 使用引号
    set
    语法(引号保护特殊字符,但不是值的一部分)
  • 引用两个比较表达式,以避免它们为空时出现问题
  • 上也应用了延迟扩展!约会
    !时间
    
  • 删除临时变量,并立即将
    用于/F
    变量
  • exit/B
    替换(注释掉)
    exit
    ,退出批处理文件,但不退出父
    cmd
    实例
  • 删除
    call
    以运行
    fciv.exe
    ,因为它不是批处理文件,而是可执行文件
实际上,我无法再现您描述的输出,因为我在回显
时得到了文件的(引用的)校验和!当前校验和,但不是您描述的部分文件路径

无论如何,我相信您为/F
选项定义的
是错误的;你需要一些东西
bd4e8c3e9b3a880365619e48a779e8e0 c:\documents and settings\Users\desktop\testfolder\testfile.txt 
set DESTINATION_DIR="C:\Documents and Settings\Users\Desktop\testfolder"