Powershell 将 : 替换为 #

Powershell replacing : with #

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

$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#\video181206_YouTube Rewind 2018 - Everyone Controls Rewind _ #YouTubeRewind_YbJOTdZBX1g.f248.webm

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

Why is it replacing : after the drive letter with a #?

执行此替换的不是 PowerShell;通过排除法,一定是yt-dlb

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

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

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

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

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

$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')).