我有以下代码从列表中复制文件。当文件夹名称中没有空格的文件路径时,它可以正常工作。但是文件夹名称有时可能有空格,我该如何改进代码以使用空格处理文件夹名称
FOR /F %%a in (find_file_list.txt) DO COPY "%%a" "C:\test\%%~nxa"
基本上,在此find_file_list.txt中,列出了所有带有路径的文件
c:\abc\def\12345.txt
c:\abc\def\12346.txt
c:\abc\def\12347.txt
以上代码将所有这三个文件复制到test文件夹中,并且工作正常。 现在,当find_file_list.txt更改时,实际的文件夹名称中实际上有空格,例如
c:\ab c\de f\12345.txt
c:\ab c\de f\12346.txt
c:\ab c\de f\12347.txt
上面的代码不再起作用... 有什么想法吗?
答案 0 :(得分:1)
您忘记选择要分割的delims
:
FOR /F "delims=" %%a in (find_file_list.txt) DO COPY "%%a" "C:\test\%%~nxa"
默认分隔符为空格,如果文件包含空格,它将在空格处拆分。
只需添加"delims="
即可将其更改为完整的字符串。
答案 1 :(得分:0)
要输出文件中的每个非空行,应确保规定all tokens
或no delimiters
,(根据您的任务,您可能还需要防止排除以特定字符开头的行,默认的For
行为是忽略所有以分号( ;
)开头的行。
< em>在这种情况下,我倾向于规定all tokens
;与规定no
分隔符不同,这将删除每一行中的所有前导空白(这将防止拾取带有意外前导空格的文件)。
您不能copy
一个不存在的文件,可以尝试使用2>Nul
来抑制任何错误,但是我认为最好先查看该文件是否存在。
copy
文件时,您只需要提供目的地,(如果您要更改文件名,则只需提供文件名)。
代替使用Copy
命令,而可以使用XCopy
命令,这样做的好处是可以创建目标目录(取决于权限)(如果有)。还不存在。
因此,这里是一个批处理文件示例:
@For /F UseBackTokens^=*EOL^= %%A In ("find_file_list.txt") Do @If Exist "%%A" XCopy "%%A" "C:\test\">Nul
…以及要从命令提示符运行的稍作修改的版本:
For /F UseBackTokens^=*EOL^= %A In ("find_file_list.txt") Do @If Exist "%A" XCopy "%A" "C:\test\">Nul