2011-06-26 43 views
3

在Windows XP批处理文件中,我抓取一个FTP目录列表并使用For /F循环处理它。包含文件名的最后一个标记最后以一个回车(0D)作为变量中的最后一个字符。一旦检索,我尝试使用令牌中的值失败,因为回车导致我的If语句换行到行首。从环境变量中删除回车 - XP命令行

@echo off 
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
    if 'Stuff.zip'=='%%B' Set StuffDate=%%A 
    ) 
echo Stuff.zip was saved on %StuffDate%. 

内容要被处理如下:

ftp> dir 
200 PORT command successful. 
150 Opening ASCII mode data connection for /bin/ls. 
01-04-10 10:00AM    93882 Logo.jpg 
02-05-10 11:01PM  <DIR>   PCODE 
03-06-10 12:02PM    42333443 Saved stuff.zip 
04-07-10 12:42PM    49343848 Stuff.zip 
226 Transfer complete. 

经检验用十六进制编辑,每条线与0D 0D 0A结束,而不是仅仅0D 0A。我不知道为什么额外的0D在那里,但我需要将其删除,以便我的程序正常工作。

期间,当%% B等于Stuff.zip执行过程中,If应该是这样的:

(if 'Stuff.zip'=='Stuff.zip' Set ReleaseDate=04-07-10) 

If行结束这样看,因为CR的:

' Set ReleaseDate=04-07-10) 'Stuff.zip 

在处理0D回车符时,(if 'Stuff.zip'=='Stuff.zip被覆盖。

如何摆脱环境变量末尾多余的0D?

回答

2

即使您的代码行看起来好奇,它也能正常工作。
但在你的情况下,有多种方法可以删除<CR>

第一种也是最简单的方法 - 使用批解析器,因为解析器在百分比展开阶段之后和特殊字符阶段之前删除所有<CR>字符。

@echo off 
setlocal EnableDelayedExpansion 
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
    set "fileName=%%B" 
    call :removeCR 
    if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A 
    ) 
echo Stuff.zip was saved on %StuffDate%. 
goto :eof 

:removeCR 
set "fileName=%fileName%" 
goto :eof 

但通常这种解决方案可能会导致一些问题,如特殊字符,如感叹号引号等。

另一种方法是用空字符串替换<CR>

@echo off 
setlocal EnableDelayedExpansion 
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
    set "fileName=%%B" 
    call :removeCR 
    if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A 
    ) 
echo Stuff.zip was saved on %StuffDate%. 

:removeCR 
set "fileName=%fileName:<CR>=%" 
goto :eof 

在线路set "fileName=%fileName:<CR>=%"具有<CR>要改变为0X0D用十六进制编辑器。 但是这种解决方案与第一种解决方案一样具有相同的特殊字符问题,并且无法用普通的文本编辑器创建它。

最后一个解决方案创建一个单一的<CR>,并在具有延迟扩展的:removeCR函数中使用它。
此解决方案对除感叹号以外的所有特殊字符都是安全的。

@echo off 
setlocal EnableDelayedExpansion 
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 

for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
    set "fileName=%%B" 
    call :removeCR 
    if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A 
    ) 
echo Stuff.zip was saved on %StuffDate%. 

:removeCR 
for %%a in ("!CR!") do (
    set "fileName=!fileName:%%~a=!" 
) 
goto :eof