对于批处理中的 /F:使用空格转义类型文件名

For /F in Batch: escaping type filename with spaces

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

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

并且 ,., 等字段变为 ,,

我正在使用 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),我会得到如下错误:

(when usebackq follows the /f) usebackq was unexpected at this time

(when "usebackq" follows the /f) tokens=* delims= eol= was unexpected at this time

(when "usebackq tokens^=^ delims^=^ eol^= " follows /f) tokens^=^ delims^=^ eol=" was unexpected at this time

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

如有任何帮助,我将不胜感激!

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

您的问题只是 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!
)