【问题标题】:Strip out a carriage return from an environment variable - XP command line从环境变量中去除回车 - XP命令行
【发布时间】:2011-09-23 00:56:12
【问题描述】:

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

@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 ) 

由于 CR,If 行最终看起来像这样:

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

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

如何去掉环境变量末尾多余的 0D?

【问题讨论】:

    标签: command-line ftp batch-file environment-variables token


    【解决方案1】:

    即使您的代码行看起来很奇怪,它也能正常工作。
    但在您的情况下,有多种方法可以删除&lt;CR&gt;

    第一种也是最简单的方法 - 使用批处理解析器,因为解析器会在百分比扩展阶段之后和特殊字符阶段之前删除所有 &lt;CR&gt; 字符。

    @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
    

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

    另一种方法是将&lt;CR&gt;替换为空字符串。

    @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:&lt;CR&gt;=%" 行中的&lt;CR&gt; 必须使用十六进制编辑器更改为 0x0D。 但是这个解决方案和第一个解决方案有同样的特殊字符问题,你不能用普通的文本编辑器创建它。

    最后一个解决方案创建一个 &lt;CR&gt; 并在 :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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2010-09-24
      相关资源
      最近更新 更多