如何在使用 youtube-dl 下载电影后将输出文件名和扩展名存储为变量,并在稍后的 CMD 批处理中使用它?以下是将视频从 YouTube 下载到当前目录的命令示例,其中URL
是视频的 URL。
youtube-dl URL
将输出文件名存储在名为的变量中my_variable
。
编辑:具体来说,我想使用一个简单的 cmd 批处理文件通过 youtube-dl 下载视频,该文件将在末尾提供一个 CHOICE 命令,并提供使用 MPC-HC 打开输出文件的选项。
我需要将输出放入变量的方法
youtube-dl --get-filename -o "%(title)s.%(ext)s" URL
以便我稍后可以将其用于以下行
"C:\Program Files\MPC-HC\mpc-hc64.exe" "D:\Downloads\%my_variable%" /play
答案1
以下命令下载 YouTube 视频并将其命名为与 YouTube 上的相同标题,后跟下载视频的扩展名。
youtube-dl -o "%(title)s.%(ext)s" URL
以下命令仅下载视频的标题和扩展名,并在命令后的下一行显示结果。
youtube-dl --get-filename -o "%(title)s.%(ext)s" URL
Windows 批处理文件中的以下命令仅下载视频的标题和扩展名,并将结果存储在名为的变量中my_variable
。
for /f "delims=" %%a in ('youtube-dl --get-filename -o "%(title)s.%(ext)s" URL') do @set my_variable=%%a
在这三个命令中,您还可以使用以空格字符分隔的多个 URL,而不是单个 URL。您还可以使用选项--batch-file FILE
将 URL 替换为存储在批处理文件中的 URL 列表(例如FILE
)。
如果您无法使用 youtube-dl 下载 YouTube 视频,通常是因为 youtube-dl 未更新到最新版本。使用 pip 在 Windows 中将 youtube-dl 升级到最新版本:
pip install --upgrade youtube-dl
在 macOS 中使用 homebrew 将 youtube-dl 升级到最新版本。许多 Linux 发行版都支持 snap 包。这允许用户安装自动更新的 youtube-dl snap 包。要安装 youtube-dl snap 包,请运行以下命令:
sudo snap install youtube-dl # 启动 youtube-dl 运行snap 运行 youtube-dl
答案2
这里描述的方法delims
并没有给我带来令人满意的结果。我努力复制这个问题,但我知道的是一些文件名失败了。因此,我设计了--exec
使用临时文件的替代解决方案(或剪贴板 - 参见答案底部),在我看来,它更优雅一些,并且这个概念也适用于其他系统。我在 Windows 10 上使用 yt-dlp 进行了测试,但原始的 youtube-dl 也可以工作。
客观优点delims
- 不受潜在产出结构变化的影响
- 支持 Unicode 字符
- 基本思想适用于其他操作系统
- 一般更可靠
代码
setlocal
chcp 65001>nul
youtube-dlp --exec "echo {}>%TEMP%\ytName" https://example.com/video_page
set /p name=<%TEMP%\ytName
del %TEMP%\ytName
rem optional part (example of use) START
choice /c yn /m "Do you wish to open downloaded file (Yes/No)?"
if %ERRORLEVEL% EQU 1 start "" %name%
rem optional part (example of use) END
endlocal
详细说明
- 设置局部变量范围,这样我们就不会污染全局命名空间
- 将代码页设置为 Unicode(代码页 65001),这样 Unicode 字符将被正确保存并将命令输出重定向到
NUL
(因为它总是用“代码页更改为......”标准输出消息确认) - 运行
youtube-dl
(或yt-dlp
)并将输出文件名写入临时文件(%TEMP%\ytName
)-{}
作为--exec
输出文件名的占位符。当然,您可以使用自己的参数,包括更改输出模板,甚至更多--exec
参数。 - 将变量设置
name
为临时文件的内容(即输出文件名;它是已经引用如果路径包含空格) - 删除临时文件
- [可选部分/示例] 询问用户是否要在默认应用程序中异步运行文件,并提供是/否选择。请注意
start ""
%name%
, 不是start ""
"%name%"
- 没有引号 - 结束变量的局部作用域 - 从现在起
%name%
将不再可用
笔记
- 我没有使用,
set name={}
因为 exec 似乎创建了自己的cmd
会话,因此执行后变量不可用 - 如果你从命令行运行它(即不是作为在会话结束时结束的批处理脚本),你可能想要一些解决方案来恢复原始代码页,因为 chcp 会针对当前
cmd
会话更改它,而不仅仅是针对脚本。如下所示:更改为代码页 65001 并恢复到之前选择的代码页
替代版本 - 使用剪贴板代替临时文件
在命令中使用--exec "echo {} | clip"
; 后两行将不再需要,与setlocal
/相同endlocal
。请记住,echo X
实际打印的是X[EOL]
,因此您可能需要修剪它。此外,没有第三方,无法将变量值设置为剪贴板内容cmd
(就我而言,您只能在 PowerShell 中执行此操作),因此除了目标是将其复制到剪贴板时,它实际上没什么用。
答案3
Set "YLink=PASTE_LINK_HERE"
"%~dp0youtube-dl.exe" --get-filename %YLink%>%tmp%\LnkNE.txt
"%~dp0youtube-dl.exe" -e --get-title %YLink%>%tmp%\LnkNO.txt
"%~dp0youtube-dl.exe" --get-description %YLink%>%tmp%\LnkD.txt
:: Set /p Below copies First Line Only
Set /p NameOnly=<%tmp%\LnkNO.txt
Set /p NameExt=<%tmp%\LnkNE.txt
Set /p DescOnly=<%tmp%\LnkD.txt
echo NameOnly: %NameOnly%
timeout 2 >nul
echo NameExt: %NameExt%
timeout 2 >nul
echo DescOnly:
for /F "usebackq tokens=*" %%A in ("%Tmp%\LnkD.txt") do (echo %%A)
pause
答案4
我现在无法评论“karel”,因此对于某些文件夹中有 youtube-dl.exe 的 Windows:
for /f "delims=" %%a in ('%~d0"%~p0"youtube-dl.exe --get-filename -o "%%(title)s.%%(ext)s" https://www.youtube.com/watch^?v^=O1abcdefgh') do set my_variable=%%a
Windows。使用从剪贴板获取的 URL,以最佳质量将视频和音频下载到您的桌面,并使用原始名称。
setlocal enabledelayedexpansion
for %%I in (powershell.exe) do if "%%~$PATH:I" neq "" (
set getclip=powershell "Add-Type -AssemblyName System.Windows.Forms;$tb=New-Object System.Windows.Forms.TextBox;$tb.Multiline=$true;$tb.Paste();$tb.Text"
)
for /f "delims=" %%I in ('%getclip% ^| findstr /n "^"') do (
set "line=%%I" & set "line=!line:*:=!"
)
set "psCommand="[Environment]::GetFolderPath('DesktopDirectory')""
for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "Desktop=%%I"
%~d0"%~p0"youtube-dl.exe -f "bestvideo[height<=1080]+bestaudio/best[height<=1080]" -o "!Desktop!\%%(title)s.%%(ext)s" !line!