【问题标题】:Forfiles copy failes when using path variableForfiles 使用路径变量时复制文件
【发布时间】: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",然后使用do copy 等来对抗%%F
  • 问题是在forfiles 中转义以下引号(编码为0x22)的尾部反斜杠。无论如何,遵循@Compo 将复制移出forfiles 的建议:这也将允许您将整个for /F 循环重定向到日志文件一次,而不是每次迭代都重新打开它(在整个过程中放置​​一对括号for /F 循环并在结尾处附加>>"%log_file%")。注意 %date%%time% 当前扩展为每个已处理文件的相同日期和时间值……
  • 要回答新问题,我的评论暗示并没有真正实现额外的效率,@aschipfl 对此进行了更好的解释,请将%date%, %time% 更改为0x25DATE0x25, 0x25TIME0x25 .
  • 谢谢我刚刚意识到我错过了你的第二条评论。

标签: batch-file variables path forfiles pushd


【解决方案1】:

这是一个快速示例,展示了我在我的 cmets 中暗示和建议的方法。

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "source=\\Path\TO\File\SOURCE\FOLDER"
Set "destination=E:\LOCAL\FOLDER"
Set "log_file=E:\LOCAL\FOLDER\Logfile.txt"

PushD "%source%"

Set "copy_count=0"
(For /F "Tokens=1,*" %%G In ('%SystemRoot%\System32\forfiles.exe /S /D -2 /C ^
 "%SystemRoot%\System32\cmd.exe /D /C If @IsDir==FALSE Echo @Path 0x25DATE0x25, 0x25TIME0x25"'
) Do Copy /Y %%G "%destination%" 1> NUL 2>&1 && Set /A copy_count+=1 & Echo %%~nxG %%H) 1> "%log_file%"

PopD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2013-09-13
    • 1970-01-01
    • 2018-09-29
    • 2019-04-11
    • 1970-01-01
    • 2022-10-17
    • 2020-06-22
    相关资源
    最近更新 更多