可能吗?查找*部分已知*文件夹名称-拆分为变量-在robocopy中插入/执行*目的地*



我使用gallery dl从Pixiv.com下载图片。下面所有的都是从Windows的.bat文件中运行的。

我手动创建一个只有{user[id]}的文件夹。

示例:Pixiv-Temp\24517

然后,我将gallery-dl.bat(它在其他地方调用gallery-dl.exe和相关的gallery-dl.conf(和一些辅助.jpg文件复制到该文件夹中。

示例:Pixiv Temp\24517\callery-dl.bat

我已经为5000多名用户做了这项工作。

从为以下配置的文件夹中运行gallery-dl.bat,传递文件夹名称的变量将下载pics,并将*.sqlite3文件保存到文件夹24517。

gallery-dl.conf

"directory": ["{user[id]}"],

gallery-dl.bat的作用部分(完整列出,如下(。

"C:UsersAdminS6gallery-dlgallery-dl.exe" -d "....." --download-archive "%~dp0GDB.sqlite3" "https://www.pixiv.net/en/users/%FOLDER%/illustrations"

整个当前.bat文件:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0" || exit /B
move /y "..Folder2.jpg" "..Folder.jpg"
for %%I in (..) do set "FOLDER=%%~nxI"
for /f "tokens=1 delims= " %%a in ("%FOLDER%") do set tmpFOLDER=%%a
"C:UsersAdminS6gallery-dlgallery-dl.exe" -d "....." --download-archive "%~dp0GDB.sqlite3" "https://www.pixiv.net/en/users/%FOLDER%/illustrations"
del "..Folder3.jpg"
if not exist "GDB.sqlite3" move /Y "..Folder4.jpg" "..Folder.jpg"
if exist "GDB.sqlite3" del "..Folder4.jpg" && del "..Folder.jpg"
if exist "..*.mp4" md "..Reels" & move /y "..*.mp4" "..Reels"
if exist "..*.gif" md "..GIFs" & move /y "..*.gif" "..GIFs"
if exist "..*.webp" md "..WEBPs" & move /y "..*.webp" "..WEBPs"
robocopy "....%FOLDER%" "X:11Webgallery-dlPixiv - Temp24517 -" *.* /e /move
TIMEOUT /T 1
popd
endlocal

我现在计划将gallery-dl.conf更改为{user[id]}-{user[name]}。这将导致gallery dl现在创建的目标文件夹发生更改。原始文件夹保持不变。

示例我的原始源文件夹:Pixiv Temp\24517

示例库dl新输出文件夹:Pixiv Temp\24517-ケースワベ

gallery-dl.conf

"directory": ["{user[id]} - {user[name]}"],

gallery-dl.exe

"C:UsersAdminS6gallery-dlgallery-dl.exe" -d "....." --download-archive "%~dp0GDB.sqlite3" "https://www.pixiv.net/en/users/%FOLDER%/illustrations"

由于不知道{user[name]}将如何在Explorer文件夹命名中出现,我只能手动创建一个只有{user[id]}的原始源文件夹由于轻松,我将继续这样做

上述变化将带来我想克服的问题:

  1. 运行gallery dl时,Pixiv中的pics将被下载到Explorer文件夹名称为{user[id]}-{user[name]},而原始手动创建的文件夹仍然承载gallery dl和*.sqlite3文件。我需要把这些组合起来。

  2. 当针对5000+个其他文件夹重新运行/更新gallery dl时,我将剩下一个{user[id]}中的5000个和另一个{user[id]}-{user[name]}的5000个。

机器人在解决这些问题方面表现出了最大的希望。当在下面的.bat中运行时,gallery dl会运行,{user[id]}文件夹中的所有文件都会移动到{user[id]}-{user[name]}目录中,使{user[id]}为空,我只运行一个删除所有空文件夹的脚本。这还有一个额外的好处,即.sqlite3文件都被移动了。

我的问题:如果不使用,我还没有成功使用Robocopy

  1. 显式命名目标文件夹的路径

示例工作:

robocopy "....%FOLDER%" "X:11Webgallery-dlPixiv - Temp24517 -" *.* /e /move

示例不起作用:

robocopy "....%FOLDER%" "....24517 -" *.* /e /move

在通过第二个变量后,它看起来更像:

示例不起作用:

robocopy "....%FOLDER%" "....%FOLDERDESTINATION%" *.* /e /move

也不是

  1. 我不知道如何从预先未知的文件夹名称{user[id]}-{user[name]}中传递变量,但必须在上述根文件夹中搜索

如果有从.bat文件到的方法

  1. 声明一个与当前文件夹{user[id]}匹配的变量(已在下面完成(。示例:24517

  1. gallery dl创建了新的{user[id]}-{user[name]}并完成了它的业务,.bat查找并声明了一个匹配"{user[id]}-">

示例:24517-ケースワベ

因此,我将永远知道任何变量的前半部分:

{user[id]}-

或者在这种情况下是

24517-

问题是,是否可以根据已知的(示例24517-(来搜索整个新文件夹名称,一个合适的辅助变量创建为等同于新文件夹名称

  1. 然后能够将此变量传递给Robocopy以成功移动所有所需文件吗

示例:

robocopy "....%FOLDER%" "....%FOLDERDESTINATION%" *.* /e /move

那太棒了!

感谢您的任何想法/协助。提前谢谢!


应用Stephan的成功答案后的最终结果

@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0" || exit /B
move /y "..Folder2.jpg" "..Folder.jpg"
for %%I in (..) do set "FOLDER=%%~nxI"
for /f "tokens=1 delims= " %%a in ("%FOLDER%") do set tmpFOLDER=%%a
"C:UsersAdminS6gallery-dlgallery-dl.exe" -d "....." --download-archive "%~dp0GDB.sqlite3" "https://www.pixiv.net/en/users/%FOLDER%/illustrations"
del "..Folder3.jpg"
if not exist "GDB.sqlite3" move /Y "..Folder4.jpg" "..Folder.jpg"
if exist "GDB.sqlite3" del "..Folder4.jpg" && del "..Folder.jpg"
if exist "..*.mp4" md "..Reels" & move /y "..*.mp4" "..Reels"
if exist "..*.gif" md "..GIFs" & move /y "..*.gif" "..GIFs"
if exist "..*.webp" md "..WEBPs" & move /y "..*.webp" "..WEBPs"
for /d %%a in ("....%FOLDER% - *") do set "FOLDERDESTINATION=%%a"
rem ECHO %FOLDERDESTINATION%
robocopy "....%FOLDER%" ".%FOLDERDESTINATION%" *.* /e /move
TIMEOUT /T 1
popd
endlocal

当我正确理解你的问题时,这应该会有所帮助:

for /d %%a in ("....%folder% - *") do set "folderdestination=%%a"

(假设:每个%folder%只有一个用户名,否则只会得到最后一个(

最新更新