batch-file - 测试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\"
解决方案
复制文件的命令是COPY。它是 Windows 命令处理器的内部命令cmd.exe
。XCOPY是一个扩展的文件和目录复制可执行文件在目录%SystemRoot%\System32
中,自 Windows Vista 以来已弃用,因为有更强大的ROBOCOPY具有完整的限定文件名%SystemRoot%\System32\robocopy.exe
。
对于这个简单的文件复制任务,无需使用XCOPY或ROBOCOPY 。COPY在源文件上就足够了aGallery-dl.bat
,Folder.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.jpg
和Folder2.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 DisableDelayedExpansion
endlocal
I
a
a
推荐阅读
- sql - 计算组中最大数量的变量
- c - Assignment_SDD_Proj.exe 中 0x0F64F6E0 (ucrtbased.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000
- c - 试图找出这个例子的位掩码
- date - 在 Pharo 8 中转换指定模式的日期字符串
- wordpress - 当点击wordpress中的按钮时,可以在图像标题中添加1个按钮以获取有关该图像的表单查询?
- django - 根据Django中关联模型的属性过滤父模型实例
- python - Pandas 上的数据框聚合问题
- reactjs - npm postinstall 仅在未安装任何内容时运行
- r - 重复 data.table fread 和 fwrite 导致“权限被拒绝”错误
- python - 为 QuickFix Python TargetSubId 配置唯一会话