MSDOS 批处理文件中文件名中的空格

问题描述 投票:0回答:1

这是我运行 test.bat 文件时遇到的错误:

C:\Users>test.bat

C:\Dir1 1\file.csv

The system cannot find the file C:\Dir1.

这是test.bat文件内容:

@Echo off

set "source=C:\Dir1 1\filename.csv"

echo %source%

for /F "Delims=" %%g in (%source%) do (@echo %%g)

如您所见,目录名称中的空格似乎是问题所在。我该如何解决这个问题?

for-loop filenames
1个回答
0
投票

您正确引用了

set
声明:

set "source=C:\Dir1 1\filename.csv"

这将 source 设置为

C:\Dir1 1\filename.csv
,整个赋值周围的双引号确保双引号不会以
source
的值结束,但仍避免包含尾随空格等。如您的
 所示echo
声明:

echo %source%

考虑在此处添加引号,以完全清楚地表明此处没有任何问题。

您的问题在于

for
声明:

for /F "Delims=" %%g in (%source%) do (@echo %%g)

这应该是:

for /F "usebackq delims=" %%g in (`type "%source%"`) do (@echo %%g)

或者:

for /F "usebackq delims=" %%g in ("%source%") do (@echo %%g)

第一个有效,因为反引号现在被解释为包含要执行的命令,并且

%source%
的值放在双引号中,以确保正确处理带有空格的值。

第二个有效,因为括号中的值直接用双引号表示

for
这是一个要逐行处理的文件,并且文件名可以包含空格,不会因为引号而出现问题。

所以,更正版本:

@echo off
set "source=C:\Dir1 1\filename.csv"
echo "%source%"
for /F "usebackq delims=" %%g in ("%source%") do (@echo %%g)

有关这些命令的详细信息的重要来源在这里:https://ss64.com/nt/for_cmd.html

© www.soinside.com 2019 - 2024. All rights reserved.