Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 测试文件是否存在,删除此本地文件_Batch File_If Statement_Exists - Fatal编程技术网

Batch file 测试文件是否存在,删除此本地文件

Batch file 测试文件是否存在,删除此本地文件,batch-file,if-statement,exists,Batch File,If Statement,Exists,这个问题涉及到 背景:有时我选择在给定的文件夹中运行aGallery-dl.bat,100个文件夹中的每一个都只运行一个。它首先删除Folder.jpg,然后将Folder2.jpg重命名为Folder.jpg。这具有红色X被黄色取代的效果!在文件资源管理器中选择父文件夹查看文件夹时。其次,它调用gallery-dl.exe。我使用从红色X到黄色!让我知道我至少跑过一次。如果aGallery-dl.bat成功完成,它将最终删除当前为黄色的文件夹.jpg!,现在,文件夹的代表性内容通常是Devia

这个问题涉及到

背景:有时我选择在给定的文件夹中运行aGallery-dl.bat,100个文件夹中的每一个都只运行一个。它首先删除Folder.jpg,然后将Folder2.jpg重命名为Folder.jpg。这具有红色X被黄色取代的效果!在文件资源管理器中选择父文件夹查看文件夹时。其次,它调用gallery-dl.exe。我使用从红色X到黄色!让我知道我至少跑过一次。如果aGallery-dl.bat成功完成,它将最终删除当前为黄色的文件夹.jpg!,现在,文件夹的代表性内容通常是DeviantArt.jpg。一切都很好

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
问题:正在重新启动,Gallery-dl.bat位于100个文件夹中的每个文件夹中。有时,我会在它的本地文件夹中运行其中一个。第5行,如果对网站的调用成功,gallery-dl.exe将在本地文件夹中创建zzzGDB.sqlite3

在前面的代码中,当aGallery-dl.bat完成时,它只会删除文件夹.jpg。这假定对网页的调用成功。在极少数情况下,对网页的调用会因多种原因而失败,尽管由于最终的del而关闭。\Folder.jpg,它仍然会删除Folder.jpg

如果没有创建/不存在zzzGDB.sqlite3,我需要文件夹.jpg黄色!留下来

因此,在下面的代码行6(现在为空)中,我删除了最后的del.\Folder.jpg,并尝试从第7行开始插入提供的代码,插入对zzzGDB.sqlite的测试。如果找到,请删除。\Folder.jpg。如果未找到,则不会对folder.jpg执行任何操作,因为它仍然存在。 最下面的rem语句只是作为我自己知识的占位符

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 ".\zzzGDB.sqlite3" "https://www.deviantart.com/"%FOLDER%"/gallery/all"

setlocal EnableExtensions DisableDelayedExpansion
for /D %%I in ("U:\11Web\gallery-dl\deviantart\*") do (
    if exist "%%I\zzzGDB.sqlite3" (
        del "%%I\Folder.jpg"
    )
rem 
)
endlocal
注意:目前,修改后的代码会通过U:\11Web\gallery dl\DeviceArt\*中的每个文件夹返回。此操作应仅保留给本地文件夹。我猜下面就是问题所在

for /D %%I in ("U:\11Web\gallery-dl\deviantart\*")
我不知道如何删除它,并仍然实施后做的一切


我建议对aGallery-dl.bat使用以下行

前两行定义批处理文件的执行环境

命令PUSHD的第三行推送堆栈上的当前目录路径,并将执行的批处理文件的目录设置为当前目录。这甚至适用于存储在使用路径访问的网络资源上的批处理文件,除非在执行该命令行时存在网络问题

如果出现错误,立即退出批处理文件的处理,则执行“退出”命令。批处理文件目录不能设置为当前目录。在本例中,Windows命令处理器隐式运行命令ENDLOCAL

有关运算符| |的说明,请参阅。该运算符仅在pushd退出时,使用非零退出代码指示错误,才会有条件地执行exit/B

带有MOVE的第四个命令行实际上并没有将Folder2.jpg文件的数据移动到名为Folder.jpg的文件中。实际上,它只是更新文件系统,在这种情况下,这也是通过批处理文件中的两个命令del.\Folder.jpg和ren.\Folder2.jpg Folder.jpg完成的。这是一种将一个文件替换为另一个文件的更快的方法,其优点是Folder.jpg必须不存在才能成功,而不会显示错误消息,就像命令DEL对file Folder.jpg not existing所做的那样

FOR命令行确定不带路径的当前文件夹的名称,并将其指定给环境变量folder。这是一个比使用命令行更快、更安全的解决方案:

FOR /F %%i IN ('cd') DO set FOLDER=%%~nxi
if not errorlevel 1 if exist "zzzGDB.sqlite3" del "Folder.jpg"
上面的命令行导致在后台启动另一个命令进程,并将%ComSpec%/c和命令行之间的“作为附加参数附加”。因此,在Windows安装到C:\Windows的情况下,会在后台执行以下操作:

已启动的cmd.exe执行内部命令cd,输出当前目录的完整限定文件夹名,以处理后台命令进程的标准输出。此输出由处理批处理文件的cmd.exe捕获,并在启动后由for处理。cmd.exe在完成命令CD的执行后自行关闭

FOR命令将使用普通空格和水平制表符作为字符串分隔符将文件夹路径拆分为子字符串标记,如果第一个空格/制表符分隔的字符串以分号开头,则下一步将查看,在这种情况下,捕获的行将被忽略以供进一步处理,否则,只将第一个空格/制表符分隔的字符串分配给循环变量i。因此,如果当前目录的完整限定文件夹名包含空格,则此命令行将无法确定当前目录的文件夹名,而不包含路径

存在动态变量CD,其值可以用%CD%引用。该值是当前目录的完整限定文件夹名,不以反斜杠结尾,但驱动器的根目录是当前目录 埃克托里。这将与批处理文件aGallery-dl.bat的%%dp0相同,不同之处在于%%dp0扩展为批处理文件文件夹的完整限定名,并始终在末尾加上反斜杠

然而,无论是动态变量CD还是%%dp0,还是在后台单独的命令进程中执行命令CD,都不能真正用于获取当前目录的名称=没有路径的批处理文件目录。最好的方法是使用:

for %%I in (.) do set "FOLDER=%%~nxI"
这个简单的FOR除了通过一个非常快速执行的文件系统查询获取当前文件夹的名称(不带路径)并将其分配给环境变量folder之外,并没有其他作用

注:对于%%I英寸%%dp0。do set FOLDER=%%~nxI还可用于获取文件夹名,但如果当前目录不是批处理文件目录,则不包含包含当前执行批处理文件的文件夹路径

第六个命令行使用各种参数执行gallery-dl.exe

请注意https://www.deviantart.com/%FOLDER%/gallery/all 是一个无效的参数字符串。在一个文件中包含是无效的。该字符在引用文件或文件夹的参数字符串中永远无效。此语法错误被检测并自动修复,这就是批处理文件中的命令行能够正常工作的原因。正确的参数字符串为https://www.deviantart.com/%FOLDER%/gallery/all 一个在开头,一个在结尾,参数字符串中没有双引号,用双引号括起来

对于控制台应用程序,有一个标准的退出条件,成功时值为0,错误时值大于1。我不知道gallery-dl.exe是否也是如此,但我假设在命令行中:

FOR /F %%i IN ('cd') DO set FOLDER=%%~nxi
if not errorlevel 1 if exist "zzzGDB.sqlite3" del "Folder.jpg"
if not errorlevel 1检查分配给动态变量errorlevel的gallery-dl.exe的退出代码是否不大于或等于1,这意味着小于1,这意味着在可执行文件上等于0,永远不要以负值退出,任何操作系统上的程序都不建议这样做,这意味着在执行过程中不会发生错误gallery-dl.exe。请阅读gallery-dl.exe有关此程序的退出代码的文档,或在命令提示窗口中多次执行,并在每次执行gallery-dl.exe成功或出现错误(如错误URL)后使用回显退出代码:%errorlevel%

这个条件应该已经足够了。但仅在删除当前目录中的文件Folder.jpg(批处理文件目录)之前,使用了另一个条件来检查当前目录中是否存在文件zzzGDB.sqlite3

请阅读中的第2期,了解写入批处理文件的原因

if not errorlevel 1 if exist "zzzGDB.sqlite3" del "Folder.jpg"
而不是

if not errorlevel 1 (
    if exist "zzzGDB.sqlite3" (
        del "Folder.jpg"
    )
)
上面的代码也可以工作,但与在一个命令行上使用两个IF命令和一个DEL命令的单行代码相比,Windows命令处理器需要更多的CPU周期来处理这些代码

最后一行从堆栈中弹出初始当前目录的完整限定文件夹名,并将其再次设置为当前目录,最后一行在启动批处理文件时恢复初始执行环境

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

呼叫/?。。。解释dp0。。。参数0的驱动器和路径。。。完整批处理文件路径。 德尔/? 回声/? endlocal/? 出口/? 对于/? 移动/? popd/? pushd/? 集/? setlocal/?
神圣的烟。我回答了我自己的问题。最后一次成功了。将答案留给其他人使用。请将其作为答案发布,并单击旁边的复选框将该答案标记为已接受。
if not errorlevel 1 (
    if exist "zzzGDB.sqlite3" (
        del "Folder.jpg"
    )
)