如何在 FOR 中的 IF 条件下读取变量
How to read variable on a IF condition inside a FOR
我是批处理脚本的真正新手,我在此处和 ss64.com.
上搜索和阅读时使用了我编写的全部代码
我正在尝试实现 youtube-dl 批处理脚本的解决方案,其中下载 list.txt 行上具有最佳比特率的视频,但它不能是 MKV 或使用重新编码,这需要时间和 CPU 处理。因此,我需要获取 return 扩展文件以了解哪个命令将指定给 运行。一个说要使用 mp4 扩展名和 m4a 音频扩展名获得最佳视频并与 ffmpeg 合并,或者一个说使用 VP9 编解码器获得最佳视频和使用 Opus 编解码器获得最佳音频,它们都是 webm 扩展名并组合成一个完美的 webm 文件.
我已经为一个 link 案例做了这个,现在我正在尝试在 txt 文件中实现 links 的列表。
正如在 youtube-dl FAQ -a 或 --batch-file 参数上一样,在 txt 文件中下载 link 的列表,每行一个 link,但作为我希望下载可用的最佳比特率但我不能使用它,因为它会导致获取可检测到的扩展名上的所有 link。 (webm 和 mp4)
例如,运行使用下面的代码安装 .bat,将导致下载两个扩展中的所有内容。
@echo off
@For /F Delims^=^ EOL^= %%G In ('youtube-dl -f "bestvideo[height<=2160]/best[height<=2160]" --get-filename -o "%%(ext)s" -a LiST.txt') Do (
if "%%~G" EQU "mp4" (youtube-dl --simulate --console-title -f "bestvideo[height<=2160][ext=mp4]+bestaudio[ext=m4a]/best[height<=2160]" -a LiST.txt)
if "%%~G" EQU "webm" (youtube-dl --simulate --console-title -f "bestvideo[height<=2160][ext=webm]+bestaudio[ext=webm]/best[height<=2160]" -a LiST.txt)
)
所以我不得不以另一种方式执行此操作,而不使用 --batch-file / -a
问题是变量看起来不是作为调用命令的结果读取的,而是 IF 条件下的字符串化命令
@echo off
setlocal enableDelayedExpansion
@For /F Delims^=^ EOL^= %%G In (LiST.txt) Do (
SET ext=youtube-dl -f "bestvideo[height<=2160]/best[height<=2160]" --get-filename -o "%%(ext)s" %%~G &call %%ext%%
if "!ext!" EQU "mp4" (youtube-dl --simulate --console-title -f "bestvideo[height<=2160][ext=mp4]+bestaudio[ext=m4a]/best[height<=2160]" %%~G)
if "!ext!" EQU "webm" (youtube-dl --simulate --console-title -f "bestvideo[height<=2160][ext=webm]+bestaudio[ext=webm]/best[height<=2160]" %%~G)
)
pause
我尝试在行尾使用 SET ext 和 &call %%ext%%
和 &!ext!
,两者似乎都按预期 returning,但 IF 似乎return "youtube-dl -f ..." 命令 stringfy,则永远不会达到条件。我在使用 a
后得出了这个结论
else ( echo !ext! )
PS:
- list.txt的内容是youtubelink每行一个
- %%G代表txt文件每行link
- 我使用 --simulate 参数只是为了测试代码
我应该怎么做才能读取变量上命令的结果?
在 youtube-dl.exe 的同一文件夹中,我有 LiST.txt 文件,其中每行粘贴了一个 youtube links,作为具有以下代码的 .bat 文件。
- 首先
@For
它读取 txt 文件寻找要下载的 youtube links 并将 link 存储在 %%G 变量
- 其次
For
使用 youtube-dl 参数将结果存储在 %%H 上,要求扩展该 link 上可用的最佳视频比特率
现在我们知道最好的视频扩展是,我们要求下载最好的视频比特率过滤结合的视频和音频的扩展。 (mp4 & m4a / webm & webm)
@echo off
Title [MP4 or WEBM]
@For /F Delims^=^ EOL^= %%G In (LiST.txt) Do (
For /F "delims= eol=|" %%H in ('youtube-dl -f "bestvideo[height<=2160]/best[height<=2160]" --get-filename -o "%%(ext)s" %%~G') do (
if "%%~H" EQU "mp4" (youtube-dl --console-title -f "bestvideo[height<=2160][ext=mp4]+bestaudio[ext=m4a]/best[height<=2160]" %%~G)
if "%%~H" EQU "webm" (youtube-dl --console-title -f "bestvideo[height<=2160][ext=webm]+bestaudio[ext=webm]/best[height<=2160]" %%~G)
)
)
如果我不这样做,它会在不测量不兼容的编解码器的情况下获得最佳的视频和音频,这在大多数情况下会导致 mkv 文件。
例如,带有 VP9 编解码器 + bestaudio m4a 编解码器的文件 (webm) 将合并到 mkv 中,并且需要使用 ffmpeg 重新编码视频,因为我不想要那种格式。与 opus 音频编解码器 (webm) 合并的 mp4 文件会产生相同的结果。
Webm 是大多数时候可用于 4K 视频的最佳比特率。
请注意,我限制为 4K [height<=2160]
,因为我的计算机无法 运行 8K。
我是批处理脚本的真正新手,我在此处和 ss64.com.
上搜索和阅读时使用了我编写的全部代码我正在尝试实现 youtube-dl 批处理脚本的解决方案,其中下载 list.txt 行上具有最佳比特率的视频,但它不能是 MKV 或使用重新编码,这需要时间和 CPU 处理。因此,我需要获取 return 扩展文件以了解哪个命令将指定给 运行。一个说要使用 mp4 扩展名和 m4a 音频扩展名获得最佳视频并与 ffmpeg 合并,或者一个说使用 VP9 编解码器获得最佳视频和使用 Opus 编解码器获得最佳音频,它们都是 webm 扩展名并组合成一个完美的 webm 文件.
我已经为一个 link 案例做了这个,现在我正在尝试在 txt 文件中实现 links 的列表。
正如在 youtube-dl FAQ -a 或 --batch-file 参数上一样,在 txt 文件中下载 link 的列表,每行一个 link,但作为我希望下载可用的最佳比特率但我不能使用它,因为它会导致获取可检测到的扩展名上的所有 link。 (webm 和 mp4)
例如,运行使用下面的代码安装 .bat,将导致下载两个扩展中的所有内容。
@echo off
@For /F Delims^=^ EOL^= %%G In ('youtube-dl -f "bestvideo[height<=2160]/best[height<=2160]" --get-filename -o "%%(ext)s" -a LiST.txt') Do (
if "%%~G" EQU "mp4" (youtube-dl --simulate --console-title -f "bestvideo[height<=2160][ext=mp4]+bestaudio[ext=m4a]/best[height<=2160]" -a LiST.txt)
if "%%~G" EQU "webm" (youtube-dl --simulate --console-title -f "bestvideo[height<=2160][ext=webm]+bestaudio[ext=webm]/best[height<=2160]" -a LiST.txt)
)
所以我不得不以另一种方式执行此操作,而不使用 --batch-file / -a
问题是变量看起来不是作为调用命令的结果读取的,而是 IF 条件下的字符串化命令
@echo off
setlocal enableDelayedExpansion
@For /F Delims^=^ EOL^= %%G In (LiST.txt) Do (
SET ext=youtube-dl -f "bestvideo[height<=2160]/best[height<=2160]" --get-filename -o "%%(ext)s" %%~G &call %%ext%%
if "!ext!" EQU "mp4" (youtube-dl --simulate --console-title -f "bestvideo[height<=2160][ext=mp4]+bestaudio[ext=m4a]/best[height<=2160]" %%~G)
if "!ext!" EQU "webm" (youtube-dl --simulate --console-title -f "bestvideo[height<=2160][ext=webm]+bestaudio[ext=webm]/best[height<=2160]" %%~G)
)
pause
我尝试在行尾使用 SET ext 和 &call %%ext%%
和 &!ext!
,两者似乎都按预期 returning,但 IF 似乎return "youtube-dl -f ..." 命令 stringfy,则永远不会达到条件。我在使用 a
else ( echo !ext! )
PS:
- list.txt的内容是youtubelink每行一个
- %%G代表txt文件每行link
- 我使用 --simulate 参数只是为了测试代码
我应该怎么做才能读取变量上命令的结果?
在 youtube-dl.exe 的同一文件夹中,我有 LiST.txt 文件,其中每行粘贴了一个 youtube links,作为具有以下代码的 .bat 文件。
- 首先
@For
它读取 txt 文件寻找要下载的 youtube links 并将 link 存储在 %%G 变量 - 其次
For
使用 youtube-dl 参数将结果存储在 %%H 上,要求扩展该 link 上可用的最佳视频比特率
现在我们知道最好的视频扩展是,我们要求下载最好的视频比特率过滤结合的视频和音频的扩展。 (mp4 & m4a / webm & webm)
@echo off
Title [MP4 or WEBM]
@For /F Delims^=^ EOL^= %%G In (LiST.txt) Do (
For /F "delims= eol=|" %%H in ('youtube-dl -f "bestvideo[height<=2160]/best[height<=2160]" --get-filename -o "%%(ext)s" %%~G') do (
if "%%~H" EQU "mp4" (youtube-dl --console-title -f "bestvideo[height<=2160][ext=mp4]+bestaudio[ext=m4a]/best[height<=2160]" %%~G)
if "%%~H" EQU "webm" (youtube-dl --console-title -f "bestvideo[height<=2160][ext=webm]+bestaudio[ext=webm]/best[height<=2160]" %%~G)
)
)
如果我不这样做,它会在不测量不兼容的编解码器的情况下获得最佳的视频和音频,这在大多数情况下会导致 mkv 文件。
例如,带有 VP9 编解码器 + bestaudio m4a 编解码器的文件 (webm) 将合并到 mkv 中,并且需要使用 ffmpeg 重新编码视频,因为我不想要那种格式。与 opus 音频编解码器 (webm) 合并的 mp4 文件会产生相同的结果。
Webm 是大多数时候可用于 4K 视频的最佳比特率。
请注意,我限制为 4K [height<=2160]
,因为我的计算机无法 运行 8K。