CMD;youtube-dl:将输出文件名存储为变量

CMD;youtube-dl:将输出文件名存储为变量

如何在使用 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

  1. 不受潜在产出结构变化的影响
  2. 支持 Unicode 字符
  3. 基本思想适用于其他操作系统
  4. 一般更可靠

代码

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

详细说明

  1. 设置局部变量范围,这样我们就不会污染全局命名空间
  2. 将代码页设置为 Unicode(代码页 65001),这样 Unicode 字符将被正确保存并将命令输出重定向到NUL(因为它总是用“代码页更改为......”标准输出消息确认)
  3. 运行youtube-dl(或yt-dlp)并将输出文件名写入临时文件(%TEMP%\ytName)-{}作为--exec输出文件名的占位符。当然,您可以使用自己的参数,包括更改输出模板,甚至更多--exec参数
  4. 将变量设置name为临时文件的内容(即输出文件名;它是已经引用如果路径包含空格)
  5. 删除临时文件
  6. [可选部分/示例] 询问用户是否要在默认应用程序中异步运行文件,并提供是/否选择。请注意start ""%name%, 不是start """%name%"- 没有引号
  7. 结束变量的局部作用域 - 从现在起%name%将不再可用

笔记

  1. 我没有使用,set name={}因为 exec 似乎创建了自己的cmd会话,因此执行后变量不可用
  2. 如果你从命令行运行它(即不是作为在会话结束时结束的批处理脚本),你可能想要一些解决方案来恢复原始代码页,因为 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!

相关内容