测试IF文件是否存在,否则xcopy这两个文件

Test IF file exist, ELSE xcopy these two files

大家早上好。

所以我花了好几个小时试图将对其他 posts 的各种回复拼凑到我自己的代码中,以查看是否可以获得可用的东西。不行。我完全迷失在我现在不得不向你寻求帮助的酱汁中。

背景: OS: Windows 10 我每晚使用程序 text2folders.exe 在辅助驱动器上创建 20-30 个新文件夹。 首先,我有一个基本文件 "aGallery-dl.bat",我使用 xcopy 批处理文件填充每个文件夹。其次,我不时地使用相同的 xcopy 更新源文件 "aGallery-dl.bat",这会覆盖旧的目标文件,用最新的 "aGallery-dl.bat" 填充 所有文件夹(无论他们是否需要)。一切顺利。

@echo off
for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy /y /d ".\aGallery-dl.bat" "%%a\"

我最近决定向每个文件夹添加两个新文件,并扩展了我的 xcopy 以包含这些文件。一切顺利。

@echo off
for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy /y /d ".\aGallery-dl.bat" "%%a\"
for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder.jpg" "%%a\"
for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder2.jpg" "%%a\"

Folder.jpg a big red X

Folder2.jpg a big yellow ! mark

当我选择 运行 给定文件夹中的 "aGallery-dl.bat"(同样是 100 个中的一个)时,它首先删除 Folder.jpg,然后将 Folder2.jpg 重命名为 Folder.jpg。这具有将红色 X 替换为黄色的效果!在文件资源管理器父文件夹中查看文件夹时。其次,它调用 "gallery-dl.exe." 我使用从红色到黄色让我知道我至少有一次 运行 "aGallery-dl.bat"。一切顺利。

rem @echo off
del .\Folder.jpg
ren .\Folder2.jpg Folder.jpg
FOR /F %%i IN ('cd') DO set FOLDER=%%~nxi
"C:\Program Files (x86)\gallery-dl\gallery-dl.exe" -d "U:Web\gallery-dl" --download-archive ".\aGDB.sqlite3" "https://www.deviantart.com/"%FOLDER%"/gallery/all"
del .\Folder.jpg

如果"aGallery-dl.bat"成功完成,它最终会删除Folder.jpg(当前为黄色!),现在可以看到文件夹的代表性内容(通常是DeviantArt .jpg)。

问题: 当我必须重新 运行 我原来的 xcopy 命令来更新所有文件夹中的 "aGallery-dl.bat" 时, Folder.jpg 和 Folder2.jpg 将被重新复制到所有文件夹,这违背了目的通过 "aGallery-dl.bat." 删除它们一次 我不想返回并重新 运行 "aGallery-dl.bat" 间歇性地跨越 100 个文件夹(同样,只有那些有 aGallery-dl.bat 运行 至少一次)。我需要某种类型的测试,如果 "aGallery-dl.bat" 已经存在于目标文件夹中,请不要 xcopy Folder.jpg 和 Folder2.jpg 也就是下面的模糊示例。

*********************************Some sort of test statement here!!!***********************

:aGallery-dlPresent
GOTO eof

:aGallery-dlNotPresent
for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder.jpg" "%%a\"
for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder2.jpg" "%%a\"
GOTO eof

:eof

我在下面找到了一个有希望的候选测试语句(从 what/where 中以原始形式复制,我在其他 post 中阅读),但正在寻找 ideas/replacements 因为我不知道如何 modify/inject/implement 下面在上面工作。

If exist \%DIR%\%Folder%3456789.wav xcopy \%DIR%\%Folder%3456789.wav D:\%New Folder%\ /y

Having XCopy copy a file and not overwrite the previous one if it exists (without prompting)

注意:下面是它应该是什么样子的模糊近似值(除非有正确的 -test 语句 -)。

rem @echo off
*********************************Some sort of test statement here!!!***********************

:aGallery-dlPresent
GOTO eof

:aGallery-dlNotPresent
for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder.jpg" "%%a\"
for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder2.jpg" "%%a\"
GOTO eof

:eof

for /D %%a in ("U:Web\gallery-dl\deviantart\*.*") do xcopy /y /d ".\aGallery-dl.bat" "%%a\"

复制文件的命令是COPY。它是 Windows 命令处理器 cmd.exe 的内部命令。 XCOPY 是一个扩展文件和目录复制 可执行文件 到目录 %SystemRoot%\System32 中,自 Windows Vista 以来已被弃用,因为甚至有更强大的 ROBOCOPY 具有完整的限定文件名 %SystemRoot%\System32\robocopy.exe.

对于这个简单的文件复制任务,不需要使用 XCOPYROBOCOPYCOPY 在源文件上就足够了 aGallery-dl.batFolder.jpgFolder2.jpg 没有隐藏属性集,目标目录中的相同文件也没有没有设置只读属性。

.\ 引用当前目录,可以是任意目录。 Windows 资源管理器在双击批处理文件时将批处理文件的目录设置为当前目录。但这几乎是 运行 将执行批处理文件的目录自动设置为当前目录的批处理文件的唯一方法(除了批处理文件存储在使用 UNC 路径访问的网络资源上)。

%~dp0引用批处理文件的路径。此路径始终以反斜杠结尾,这意味着在将批处理文件路径与文件或文件夹名称连接时不需要额外的反斜杠。使用 %~dp0 可以引用与执行的批处理文件相同目录中的文件,而与执行批处理文件时的当前目录无关。

您的任务所需的批处理文件是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /D %%I in ("U:Web\gallery-dl\deviantart\*") do (
    if not exist "%%I\aGallery-dl.bat" (
        copy "%~dp0Folder.jpg" "%%I\"
        copy "%~dp0Folder2.jpg" "%%I\"
    )
    copy /Y "%~dp0aGallery-dl.bat" "%%I\"
)
endlocal

如果包含 space 或这些字符之一 &()[]{}^=;!'+,`~,file/folder 名称必须包含在 " 中。出于这个原因,所有 file/folder 名称都包含在此批处理文件中并用双引号引起来,尽管在批处理文件中没有 file/folder 名称包含 space 或列表中的字符之一。重要的是要了解在 Windows 命令处理器处理命令行后命令行的批处理文件编写方式。请参阅以下主题:

  • How does the Windows Command Interpreter (CMD.EXE) parse scripts?

Windows 解释 *.* 就像 * 一样,这意味着任何文件或文件夹名称。因此,只写 * 并省略 .*.

就足够了

请注意 for /D 会忽略设置了隐藏属性的目录。

批处理文件首先检查每个子文件夹是否不包含批处理文件aGallery-dl.bat。在这种情况下,它将两个文件 Folder.jpgFolder2.jpg 从执行批处理文件的目录复制到 U:Web\gallery-dl\deviantart.

的当前子目录

然后批处理文件 aGallery-dl.bat 从执行批处理文件的目录复制到 U:Web\gallery-dl\deviantart 的当前子目录,独立于它在目标目录中的存在。

要了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /? ... 解释 %~dp0 ... 参数 0 的驱动器和路径 ... 完整的批处理文件路径。
  • cmd /? ... 输出 Windows 命令处理器执行批处理文件的帮助。
  • copy /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • setlocal /?

另请参阅 第 6 期第 7 期 为什么使用 setlocal EnableExtensions DisableDelayedExpansionendlocal 虽然默认情况下不需要,为什么使用 I 而不是 a 作为循环变量,尽管 a 在这里也可以工作。