首页 > 解决方案 > Powershell替换:用#

问题描述

我正在尝试将带有脚本的视频下载到预定义的目录中:

$save_dir = 'video'
$list_dir = "-o N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s"
ForEach ($item in $list_dir) {
  Write-Host $item
  & yt-dlp $item `
  --cache-dir "$PSScriptRoot/bin/cache" `
  $(Get-Clipboard)
}

$list_dir作为单个元素数组是必要的(较大脚本的一部分),因此是 ForEach 循环。终端输出(请注意,您需要先将视频 URL 复制到剪贴板):

-o N:/video/%(upload_date)s_%(title)s_%(id)s.%(ext)s
[youtube] YbJOTdZBX1g: Downloading webpage
[info] YbJOTdZBX1g: Downloading 1 format(s): 248+251
[download] Destination:  N#\video\20181206_YouTube Rewind 2018 - Everyone Controls Rewind _ #YouTubeRewind_YbJOTdZBX1g.f248.webm

这最终会N#在终端运行的目录中创建一个名为的目录。为什么它:在驱动器号之后替换为#?它清楚地知道它是:基于Write-Host输出的。

标签: powershellyoutube-dl

解决方案


为什么它:在驱动器号之后替换为#

执行此替换的不是 PowerShell;通过消除过程,它必须是yt-dlb

"-o N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s"

您不能同时将选项及其参数作为单个字符串传递 - PowerShell 会将其作为单个双引号参数(由于至少存在一个空格而被双引号括起来)传递。

通过变量传递的等价物& yt-dlp -o N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s是使用数组变量,选项名称及其参数作为单独的元素传递:

$arr = '-o', "N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s"
& yt-dlp $arr --cache-dir $PSScriptRoot/bin/cache (Get-Clipboard)

注意:为简洁起见,以上使用单个数组。要定义单个数组中托管的多个数组,您可以轻松定义一个交错数组(其元素也是数组的数组);使用仅包含一个,嵌套数组(选项+参数)对的交错数组的示例,通过数组构造函数运算符的一元形式构造:

$list_dir = , ('-o', "N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s")
ForEach ($item in $list_dir) {
  & yt-dlp $item --cache-dir $PSScriptRoot/bin/cache (Get-Clipboard)
}

对于元素交错数组,放置, 子数组
( $list_dir = ('-o', 'foo'), ('-o', 'bar')) 之间。


推荐阅读