文件路径中的特殊字符问题

时间:2014-01-15 01:05:51

标签: batch-file

我今天早些时候发布了一个问题,但收到的答案并没有解决问题(可能是因为我没有提供足够的示例代码而出现错误...更不用说一些错别字了)。在这种情况下,一切正常,直到我到达具有“!”的文件路径。或“&”在路径本身。当存在这些字符中的一个时,字符将从路径中剥离(注意路径的其余部分看起来是正常的)但是当调用散列函数时,找不到修改的路径(正如人们所期望的那样)。我需要阻止这些字符被剥离,但在路径有空格或没有空格的情况下也能起作用。

我知道我需要使用扩展(或其某种形式),只是不确定确切的位置以获得所需的效果。


Code Snip

@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 

2 个答案:

答案 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