【问题标题】:For /F in Batch: escaping type filename with spaces对于批处理中的 /F:使用空格转义类型文件名
【发布时间】:2015-03-08 07:00:16
【问题描述】:

我正在尝试编写一个实用程序来获取用户的逗号分隔值文件并将单个空格和单个句点替换为空值:

所以表示为, , 的(电子表格)字段变为,,

,., 这样的字段变成,,

我正在使用 type 命令将 CSV 写入临时文件,然后在每行上使用字符串替换,然后再写入一个新的 CSV,并消除有问题的值。 !FQP! 是完全限定路径,!INTEXTFILE! 是文件名。如果!INTEXTFILE! 没有空格,则可以正常工作。

SETLOCAL ENABLEDELAYEDEXPANSION
for /f tokens^=*^ delims^=^ eol^= %%A in ('type "!FQP!!INTEXTFILE!"') do ( some commands )

但是,用户的文件中都会有空格,我已经研究并重试了几天,试图找到一种方法来完成这项工作。根据这里的多页(For /f processing filename with spaces是最简洁的)和其他参考作品,我相信我需要在/f之后使用“usebackq”,并将单引号替换为反引号。但是,如果我以任何方式使用它(带或不带引号,在 /f 之后,在 %%A 之前的每个选项之前或之后,括在方括号中,写为 usebackqParsingKeywords),我会收到如下错误:

(当 usebackq 跟在 /f 之后)此时 usebackq 出乎意料

(当“usebackq”跟在 /f 后面时)tokens=* delims= eol= 在这个时候出乎意料

(当 "usebackq tokens^=^ delims^=^ eol^= " 跟在 /f 后面时) tokens^=^ delims^=^ eol=" 此时出乎意料

我也试过不使用usebackq,但我知道这就是正确答案所在(这正是这个 sn-p 的意思:指定您可以使用引号来引用 FileNameSet 中的文件名,反引号string 作为命令执行,单引号字符串是文字字符串命令。)

我将不胜感激!

我在 64 位机器上使用 Windows 7 企业版,所以这不是我使用不支持 usebackq 的 Windows 版本的问题。

【问题讨论】:

    标签: string csv batch-file


    【解决方案1】:

    您的问题只是 FOR 循环在语法上不正确。 FOR 循环的参数应跟在 /F 开关之后并用引号引起来:

    SETLOCAL EnableDelayedExpansion
    FOR /F "usebackq tokens=* delims=" %%A IN (`TYPE "!FQP!!INTEXTFILE!"`) DO (
        REM Do some stuff...
    
        SET Value=%%A
        REM Replace spaces.
        SET Value=!Value:, ,=,,!
    
        REM Replace periods.
        SET Value=!Value:,.,=,,!
    
        ECHO !Value!
    )
    

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多