【发布时间】:2020-11-26 08:09:33
【问题描述】:
我在为目标设置路径变量时遇到问题,我想在 forfiles 命令中将文件复制到 (cmd /c copy @path destination)。
代码:
REM source folder location
set source=\\Path\TO\File\SOURCE\FOLDER
REM destination folder location
set set destination=E:\LOCAL\FOLDER\
REM log_file location
set log_file=E:\LOCAL\FOLDER\Logfile.txt
SET /a "copy_count+=0"
PUSHD %source%
for /F "delims=" %%F in ('
forfiles /S /D -2 /C "cmd /c copy @path 0x22%destination%0x22 & echo @file %date%, %time%>>0x22%log_file%0x22"
') do SET /a "copy_count"+=1
POPD
无法复制指定目录中的文件,而是将路径直接传递到命令中,例如:
.....
for /F "delims=" %%F in ('
forfiles /S /D -2 /C "cmd /c copy @path E:\LOCAL\FOLDER\ & echo @file %date%, %time%>>0x22%log_file%0x22"
') do SET /a "copy_count"+=1
POPD
有效。
我需要如何正确传递变量?
在来自@Compo的cmets之后编辑为工作代码
REM source folder location
set "source=\\Path\TO\File\SOURCE\FOLDER"
REM destination folder location
set "destination=E:\LOCAL\FOLDER\"
REM log_file location
set "log_file=E:\LOCAL\FOLDER\Logfile.txt"
SET /a "copy_count+=0"
PUSHD %source%
for /F "delims=" %%F in ('
forfiles /S /D -2 /C "cmd /c If @IsDir==FALSE copy @path %destination% & echo @file %date%, %time%>>%log_file%"
') do SET /a "copy_count"+=1
POPD
澄清@aschipfl 评论,因为我没有意识到时间戳在整个过程中保持不变 - 这是您的评论所暗示的吗?
SET /a "copy_count+=0"
PUSHD %source%
(for /F "delims=" %%F in ('
forfiles /S /D -2 /C "cmd /c If @IsDir==FALSE copy @path %destination% & echo @file %date%, %time%)>>%log_file%"
') do SET /a "copy_count"+=1
POPD
【问题讨论】:
-
我首先将
source=\\Path\TO\File\SOURCE\FOLDER更改为Set "source=\\Path\TO\File\SOURCE\FOLDER",并将set set destination=E:\LOCAL\FOLDER\更改为Set "destination=E:\LOCAL\FOLDER"。我还建议您使用Cmd /C If @IsDir==FALSE Copy…以确保也只识别文件。 -
另外,您是否考虑过在您的
For循环命令中使用"Cmd /C Echo @Path",然后使用docopy等来对抗%%F。 -
问题是在
forfiles中转义以下引号(编码为0x22)的尾部反斜杠。无论如何,遵循@Compo 将复制移出forfiles的建议:这也将允许您将整个for /F循环重定向到日志文件一次,而不是每次迭代都重新打开它(在整个过程中放置一对括号for /F循环并在结尾处附加>>"%log_file%")。注意%date%和%time%当前扩展为每个已处理文件的相同日期和时间值…… -
要回答新问题,我的评论暗示并没有真正实现额外的效率,@aschipfl 对此进行了更好的解释,请将
%date%, %time%更改为0x25DATE0x25, 0x25TIME0x25. -
谢谢我刚刚意识到我错过了你的第二条评论。
标签: batch-file variables path forfiles pushd