所以我一般都是批量编写脚本和编写脚本的新手。我最近编写了一个脚本,根据源代码的最后修改日期'来自源目录中的文件。进入目标目录。
这是脚本的摘录:
@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实际复制文件?
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。我已将变量名称更改为更具描述性的名称。
注意:我已将日期改为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评论。