我使用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]}的原始源文件夹由于轻松,我将继续这样做
上述变化将带来我想克服的问题:
运行gallery dl时,Pixiv中的pics将被下载到Explorer文件夹名称为{user[id]}-{user[name]},而原始手动创建的文件夹仍然承载gallery dl和*.sqlite3文件。我需要把这些组合起来。
当针对5000+个其他文件夹重新运行/更新gallery dl时,我将剩下一个{user[id]}中的5000个和另一个{user[id]}-{user[name]}的5000个。
机器人在解决这些问题方面表现出了最大的希望。当在下面的.bat中运行时,gallery dl会运行,{user[id]}文件夹中的所有文件都会移动到{user[id]}-{user[name]}目录中,使{user[id]}为空,我只运行一个删除所有空文件夹的脚本。这还有一个额外的好处,即.sqlite3文件都被移动了。
我的问题:如果不使用,我还没有成功使用Robocopy
- 显式命名目标文件夹的路径
示例工作:
robocopy "....%FOLDER%" "X:11Webgallery-dlPixiv - Temp24517 -" *.* /e /move
示例不起作用:
robocopy "....%FOLDER%" "....24517 -" *.* /e /move
在通过第二个变量后,它看起来更像:
示例不起作用:
robocopy "....%FOLDER%" "....%FOLDERDESTINATION%" *.* /e /move
也不是
- 我不知道如何从预先未知的文件夹名称{user[id]}-{user[name]}中传递变量,但必须在上述根文件夹中搜索
如果有从.bat文件到的方法
- 声明一个与当前文件夹{user[id]}匹配的变量(已在下面完成(。示例:24517
和
- gallery dl创建了新的{user[id]}-{user[name]}并完成了它的业务,.bat查找并声明了一个匹配"{user[id]}-">
示例:24517-ケースワベ
因此,我将永远知道任何变量的前半部分:
{user[id]}-
或者在这种情况下是
24517-
问题是,是否可以根据已知的(示例24517-(来搜索整个新文件夹名称,一个合适的辅助变量创建为等同于新文件夹名称
- 然后能够将此变量传递给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%
只有一个用户名,否则只会得到最后一个(