我今天早些时候发布了一个问题,但收到的答案并没有解决问题(可能是因为我没有提供足够的示例代码而出现错误...更不用说一些错别字了)。在这种情况下,一切正常,直到我到达具有“!”的文件路径。或“&”在路径本身。当存在这些字符中的一个时,字符将从路径中剥离(注意路径的其余部分看起来是正常的)但是当调用散列函数时,找不到修改的路径(正如人们所期望的那样)。我需要阻止这些字符被剥离,但在路径有空格或没有空格的情况下也能起作用。
我知道我需要使用扩展(或其某种形式),只是不确定确切的位置以获得所需的效果。
@echo off
for /f "delims=?" %%A in (dir-selected_tmp.txt) do (
set filepath=%%A
call :filepathparse
call :md5hashchk
call :echohash
)
goto :eof
:filepathparse
for %%B in ("%filepath%") do (
set filename=%%~nxB
)
goto :eof
:md5hashchk
for /f "delims= " %%b in ('md5deep64.exe "!filepath!"') do set hashvalue=%%b
goto :eof
:echohash
echo !hashvalue!
goto :eof
答案 0 :(得分:0)
将setLocal enableDelayedExpansion
添加到脚本的开头。
除非您有感叹号,否则无法用感叹号包装变量。有关批量变量扩展的更多信息,请参阅this page。
答案 1 :(得分:0)
您的代码正如其编写,不需要延迟扩展!variables!
;只需用百分比替换感叹号:
:md5hashchk
for /f "delims= " %%b in ('md5deep64.exe "%filepath%"') do set hashvalue=%%b
goto :eof
:echohash
echo %hashvalue%
goto :eof
编辑:对评论的回复
试试这个:
@echo off
for /f "delims=?" %%A in (dir-selected_tmp.txt) do (
set "filepath=%%A"
call :filepathparse
call :md5hashchk
call :echohash
)
goto :eof
:filepathparse
for %%B in ("%filepath%") do (
set "filename=%%~nxB"
)
goto :eof
:md5hashchk
for /f "delims= " %%b in ('md5deep64.exe "%filepath%"') do set "hashvalue=%%b"
goto :eof
:echohash
set /P "=%hashvalue%" < NUL
echo/
goto :eof