首页 > 解决方案 > 测试IF文件存在,ELSE xcopy这两个文件

问题描述

大家早。

因此,我一直在努力将各种对其他帖子的回复拼凑到我自己的代码中,以查看是否可以获得可用的东西。不行。我已经完全迷失在酱汁中了,我现在不得不向你寻求帮助。

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

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

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

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

Folder.jpg 一个大红X

Folder2.jpg 一个大黄!标记

当我选择在给定文件夹中运行“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:\11Web\gallery-dl" --download-archive ".\aGDB.sqlite3" "https://www.deviantart.com/"%FOLDER%"/gallery/all"
del .\Folder.jpg

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

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

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

:aGallery-dlPresent
GOTO eof

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

:eof

我在下面找到了一个有希望的候选测试语句(从我在其他帖子中读到的内容/位置以原始形式复制),但我正在寻找想法/替代品,因为我不知道如何修改/注入/实施以下内容在上面工作。

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

让 XCopy 复制一个文件,如果它存在则不覆盖前一个文件(没有提示)

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

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

:aGallery-dlPresent
GOTO eof

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

:eof

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

标签: batch-fileif-statementtestingxcopy

解决方案


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

对于这个简单的文件复制任务,无需使用XCOPYROBOCOPY 。COPY在源文件上就足够了aGallery-dl.batFolder.jpg并且Folder2.jpg没有设置隐藏属性,并且目标目录中的相同文件没有设置只读属性。

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

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

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

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /D %%I in ("U:\11Web\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

"如果包含空格或这些字符之一,则必须将文件/文件夹名称括在其中&()[]{}^=;!'+,`~。因此,所有文件/文件夹名称都用双引号括在此批处理文件中,尽管在批处理文件中没有文件/文件夹名称包含空格或列表中的字符之一。在 Windows 命令处理器处理命令行后,了解批处理文件写入命令行的外观非常重要。请参阅以下主题:

Windows 的解释*.*就像*这意味着任何文件或文件夹名称。*出于这个原因,只需编写和省略就足够了.*

请注意,for /D忽略具有隐藏属性集的目录。

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

然后将批处理文件aGallery-dl.bat从执行的批处理文件的目录复制到U:\11Web\gallery-dl\deviantart与其在目标目录中的存在无关的当前子目录中。

要了解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

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

另请参阅此答案中的第 6章和第7章,为什么使用和虽然默认情况下不是必需的,以及为什么使用而不是作为循环变量虽然也可以在这里工作。setlocal EnableExtensions DisableDelayedExpansionendlocalIaa


推荐阅读