use*_*154 5 testing if-statement xcopy batch-file
大家早。
所以我花了几个小时试图拼凑 - 对其他帖子的各种回复 - 到我自己的代码中,以查看我是否可以获得可用的东西。不去。我已经完全迷失在酱汁中了,所以我现在必须向你寻求帮助。
背景:操作系统: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\"
Run Code Online (Sandbox Code Playgroud)
我最近决定向每个文件夹添加两个新文件,并扩展了我的 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\"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果“aGallery-dl.bat”成功完成,它最终会删除Folder.jpg(当前为黄色!),现在可以看到文件夹的代表性内容(通常是DeviantArt .jpg的)。
问题: 当我必须重新运行我原来的 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 又名模糊示例,如下所示。
*********************************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
Run Code Online (Sandbox Code Playgroud)
我在下面找到了一个有希望的候选测试语句(从我在其他帖子中读到的内容/地方以原始形式复制),但我正在寻找想法/替换,因为我不知道如何修改/注入/实施以下内容在上面工作。
If exist \\%DIR%\%Folder%\123456789.wav xcopy \\%DIR%\%Folder%\123456789.wav D:\%New Folder%\ /y
Run Code Online (Sandbox Code Playgroud)
让 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\"
Run Code Online (Sandbox Code Playgroud)
复制文件的命令是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
Run Code Online (Sandbox Code Playgroud)
如果文件/文件夹名称"包含空格或这些字符之一,则必须将其括起来&()[]{}^=;!'+,`~。出于这个原因,所有文件/文件夹名称都用双引号括在此批处理文件中,尽管在批处理文件中没有文件/文件夹名称包含空格或列表中的字符之一。在 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会在这里工作了。
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |