由于文件路径中的空格,批处理脚本无法正常工作

时间:2015-02-04 08:01:47

标签: batch-file scripting cmd batch-processing

所以我一般都是批量编写脚本和编写脚本的新手。我最近编写了一个脚本,根据源代码的最后修改日期'来自源目录中的文件。进入目标目录。

这是脚本的摘录:

@echo off
Setlocal EnableDelayedExpansion
echo Organise files
set /P _a="Enter source directory:"
set /P _b="Enter destination directory:"
set /P _c="Organise files by dd-mm-yyyy format (last modified)? y or n?" 
if %_c% == y goto:ddmmyy

:ddmmyy
for %%A in ("%_a%\*") do echo %%~tA %%~snA %%~xA >> "%_a%\testtoken.txt"
for /F "tokens=1-7* delims=./ " %%B in (%_a%\testtoken.txt) do (
robocopy "%_a%" "%_b%\%%B-%%C-%%D" "%%G.%%H" /xf testtoken.txt /mov
)

该脚本工作正常,除非我使用名称中包含空格的目录(例如C:\ Program Files而不是C:\ Program)。我在文件名中也有同样的问题,直到我使用8.3表示法,但是使用8.3表示法导致其他问题,比如robocopy没有复制具有相当相似名称的文件(例如.TUTORI~2,TUTORI~1,TUTORI~3等。 )

这是testtoken.txt的格式:

02/11/2014 06:02 PM SPSETU~1 .exe 
16/11/2014 09:19 AM TUTORI~4 .docx 
14/11/2014 12:00 PM TUTORI~2 .docx 
16/11/2014 09:19 AM TUTORI~3 .docx 
14/11/2014 12:00 PM TUTORI~1 .docx 
16/11/2014 09:19 AM TU44E0~1 .docx 
16/11/2014 09:19 AM TU05DE~1 .docx 
16/11/2014 10:59 PM UNIFYI~1 .pdf 
09/11/2014 07:55 PM ZOROAS~1 .jpg 

那么有没有办法让脚本忽略空格?为什么在8.3表示法中没有复制具有相似名称的robocopy文件,是否有办法强制robocopy实际复制文件?

2 个答案:

答案 0 :(得分:0)

您可能应该稍微更改文件的格式。而不是将扩展名放在最后一列,而只是在那里使用文件名。然后,您知道最后一个标记延伸到该行的其余部分,包括任何空格:

for /f "tokens=1-5* delims=/ " %A in ("09/11/2014 07:55 PM Test file with spaces.jpg") do (echo %F)

至于引用任何带空格的路径,我现在没有发现任何明显的问题。 for ... in (%_a%\testtoken.txt) 可能成为问题,可以使用

解决
for /f "usebackq <other options>" ... in ("%_a%\testtoken.txt") do ...

至少可以信任文档:

usebackq        - specifies that the new semantics are in force,
                  where a back quoted string is executed as a
                  command and a single quoted string is a
                  literal string command and allows the use of
                  double quotes to quote file names in
                  file-set.

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir"
for %%A in ("%sourcedir%\*") do echo %%~tA %%~fA>> "%sourcedir%\testtoken.txt"
for /F "USEBACKQ tokens=1,2,3,5* delims=/ " %%B in ("%sourcedir%\testtoken.txt") do IF /i "%%~nxF" neq "testtoken.txt" (

 REM method 1 - robocopy
 echo(robocopy "%%~dpF." "%destdir%\%%D-%%C-%%B" "%%F" /mov

 REM method 2 - XCOPY
 ECHO(XCOPY "%%F" "%destdir%\%%D-%%C-%%B\"

 REM method 3 - MD and move
 ECHO(MD "%destdir%\%%D-%%C-%%B\"
 ECHO(MOVE "%%F" "%destdir%\%%D-%%C-%%B\"

 ECHO ==================================
)

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。我已将变量名称更改为更具描述性的名称。

注意:我已将日期改为yyyy-mm-dd格式,这种格式比dd-mm-yyyy格式更容易排序。如果你坚持使用dd-mm-yyyy,只需反转令牌订单%% D - %% C - %% B.

我比robocopy更喜欢方法2或3,所以我对robocopy语法并不是特别熟悉。 YMMV。

所需的MD命令仅用于ECHO用于测试目的。 在您确认命令正确无法后,将ECHO(MD更改为MD以实际创建目录。附加2>nul以禁止错误消息(例如,当目录已存在时)

为了测试目的,所需的MOVE命令仅为ECHO在您确认命令正确后,将ECHO(MOVE更改为MOVE以实际移动文件。附加>nul以取消报告消息(例如1 file moved

所需的XCOPY命令仅用于ECHO用于测试目的。 在您确认命令正确后,将ECHO(XCOPY更改为XCOPY以实际复制文件。

所需的ROBOCOPY命令仅用于ECHO用于测试目的。 在您确认命令正确后,将ECHO(ROBOCOPY更改为ROBOCOPY以实际复制文件。

显然,选择三种方法中的一种。

请注意,排除testtoken.txt可能无效,因为您的代码定位的是短文件名,而testtoken.txt是长文件名。我不确定robocopy是否会例外,但我实施的if门肯定会。

由于我的日期格式与您的不同,我使用您的数据来测试我的系统上的程序。显然,它似乎工作,我不打扰发布它。

for...%%B语句中的令牌控件设计用于分配%% B,C,D,跳过令牌4(时间)和%% E分配给“AM / PM”的日,月和年 - 用作虚拟。%% F获取该行的其余部分,该行应该是%%~fA生成的列表文件中的完整文件名。


编辑代码以删除添加到testtoken.txt行的终端空间以响应OP评论。