批处理文件运行良好。转换为 exe 后,它不起作用

批处理文件运行良好。转换为 exe 后,它不起作用

(下面有更新和解决方案)

我有一个批处理文件,它使用 youtube-dl 从 URL 获取信息,然后将其发送到 Internet Download Manager。作为批处理文件,它运行完美。它解析 URL,然后将其与视频的名称和扩展名一起发送到 IDM。

例如:

网址:https://www.youtube.com/watch?v=kbBgx0BEuuI

处理完毕后,打开 IDM GUI 下载确认窗口,其中设置文件夹和名称,本例中为“c:\users\username\downloads\It's soapy.mp4”

然后我只需要点击“开始下载”即可。

但是在我将其转换为 exe 之后(使用 Advanced BAT to EXE Con​​verter v4.11),文件名变得混乱,显示如下:

“c:\users\downloads\videoplayback.mp4”

我将添加脚本并对其进行解释。(请注意,我在脚本中使用的所有程序的路径都在 PATH 环境变量中,并设置为以管理员身份运行)

带括号解释的脚本[此行执行以下操作]:

@echo off
pushd "%~dp0" [sets folder as current folder]
for /f %%i in ('powershell -command "Get-Clipboard"') do set link=%%i [sends youtube page url (like the one I linked above) from clipboard to the "link" variable]
youtube-dl -g -f best %link% | clip [copies direct download url to clipboard]
for /f %%i in ('powershell -command "Get-Clipboard"') do set url=%%i [sends direct download url from clipboard to "url" variable]
youtube-dl -f best --get-filename -o "%(title)s.%(ext)s" "%link%" | clip [copies the video's name and extension to the clipboard]
for /f %%i in ('powershell -command "Get-Clipboard"') do set filename=%%i [sends the filename from clipboard to the "filename" variable, so now the filename variable is, in this case "It's sodium chloride.mp4"]
set folder="c:\user\<username>\downloads" [sets the folder variable to my chosen download folder]
IDMan /d "%url%"  /p %folder% /f "%filename%" [sends all of the previous information to IDM as direct url to download, save folder, and filename(including extension)]

重申一下,使用 .bat 文件并在 cmd 上运行命令 - 它们都可以完美运行,但是一旦将其转换为 .exe 并运行,文件名将变为“videoplayback”,如果它是从直接下载 url 获取的,它将是视频标题,而不是从脚本在开始时获取的正常 youtube url 获取的(link=常规 youtube 链接,url=直接视频文件 url)

以下再次是没有括号的脚本,因此您可以根据需要复制并测试它(只需记下文件夹变量中的用户名):

@echo off
pushd "%~dp0"
for /f %%i in ('powershell -command "Get-Clipboard"') do set link=%%i
youtube-dl -g -f best %link% | clip
for /f %%i in ('powershell -command "Get-Clipboard"') do set url=%%i
youtube-dl -f best --get-filename -o "%(title)s.%(ext)s" "%link%" | clip
for /f %%i in ('powershell -command "Get-Clipboard"') do set filename=%%i
set folder="c:\user\<username>\downloads"
IDMan /d "%url%"  /p %folder% /f "%filename%"

更新:由于某种原因,批处理文件本身也开始出现问题,因此我能够在启用 echo 的情况下运行它并找出了问题所在:

在以下行中:

youtube-dl -f best --get-filename -o "%(title)s.%(ext)s" "%link%" | clip

它将“%(title)s.%”注册为一个不存在的变量,并将其替换为空,这导致此命令仅发送部分信息。我将它们分成 2 行,变量为“filename”和“extension”,但仍然不起作用......希望我能尽快解决这个问题并关闭这个问题。

答案1

显然,这个问题其实很简单,我早就应该注意到了。在批处理文件中,当您在任何内容之前使用“%”(例如“%i”)时,与在前后使用它(调用变量时 - “%variable%”)相比;您实际上必须使用双百分比,因为当脚本实际运行时,它会消失(在批处理中,“%%i”在运行时将变为“%i”)。因此在以下行和其他类似的行中:

youtube-dl -f best --get-filename -o“%(title)s”“%link%”| clip

脚本运行时,“(title)s”之前的“%”会消失,并使整个字符串“%(title)s”留空,因此该行实际上运行如下:

youtube-dl -f best --get-filename -o "%link%" | clip

因此,我只需在所有只有一个“%”的迭代之前添加另一个“%”,现在它终于可以工作了,例如 - 我上面给出的示例行的最终工作版本:

youtube-dl -f best --get-filename -o "%%(title)s" "%link%" | clip

我本可以早点发现这个问题,因为我将代码逐行复制到 cmd 并从包含“%%i”的行中删除了一个“%”,这样它就可以正常运行了,但我在其他地方完全没有注意到,因为它们是 youtube-dl 的参数,而不是批处理的参数,所以我没有考虑这个问题。案子了结了。

相关内容