Powershell - 抓取文件夹名称并保存到数组有时会将每个字母作为一个项目抓取

Powershell - 抓取文件夹名称并保存到数组有时会将每个字母作为一个项目抓取

我正在尝试整理一个 .ps1 文件来扫描我 Plex 存储中现有的电影,并将其与我用来提取电影的驱动器进行比较。然后,它将生成一个我没有的电影数组(由文件名确定)和一个我已经拥有的电影数组。在详细介绍之前,我将分享我的电影在 Plex 媒体文件夹中的组织方式。

我的文件夹根目录列出了存储的媒体类型。例如:\Tower.pauk.us\Movies、\Tv Shows、\Music、\Photos 等。

对于这个程序,我只关注 \Movies\ 文件夹。

在 \Movies\ 文件夹中,我为字母表中的每一个字母、数字和符号都创建了一个文件夹。例如 #\、\A\、\B\、...\Z\ 有时,在这些文件夹中,我会创建一个文件夹,比如说“昆汀·塔伦蒂诺合集”。尽管该文件夹中的电影不是以“Q”开头,但合集以“Q”开头,因此它将位于 /Q/ 文件夹中。

好的,现在一切都结束了,我可以开始尝试解释我现有的代码的作用了。以下是我的代码:

$PlexMovieFolders = Get-ChildItem \\Tower.pauk.us\Plex\Movies\ | Where-object {$_.PSIsContainer} | Foreach-Object {$_.Name}

$List1 = Get-ChildItem -Path F:\ -Name -File -Exclude *.srt,*.DS_Store,*.dat,*.jpg
$List2 = @()
$Match = @()
$No_Match = @()


for ($i1 = 0; $i1 -le ($PlexMovieFolders.length - 1); $i1 += 1){
    $SubFolders = @()
    $folder = $PlexMovieFolders[$i1]
    $List2 += Get-ChildItem -path \\Tower.pauk.us\Plex\Movies\$folder\ -Name -File -Exclude *.srt,*.DS_Store,*.dat,*.jpg
    $SubFolders = Get-ChildItem \\Tower.pauk.us\Plex\Movies\$folder\ | Where-object {$_.PSIsContainer} | Foreach-Object {$_.Name}
    if ($SubFolders.Length -gt 0) {
            for($i2 = 0; $i2 -le ($SubFolders.Length - 1); $i2 += 1){
                $folder2 = $SubFolders[$i2]
                $List2 += Get-ChildItem -Path \\Tower.pauk.us\Plex\Movies\$folder\$folder2\ -Name -File -Exclude *.srt,*.DS_Store,*.dat,*.jpg
    }
    }
}


for ($i2 = 0; $i2 -le ($List2.length - 1); $i2 += 1){
    Write-Host ($List2.length - $i2) "Items Left"
    for ($i1 = 0; $i1 -le ($List1.length - 1); $i1 += 1){
        if($List1[$i1] -eq $List2[$i2]){
            $Match += $List1[$i1]
        }else{
            $No_Match += $List1[$i1]
        }
    }
}

我们将逐行进行,显然是从顶部开始。

$PlexMovieFolders = Get-ChildItem \\Tower.pauk.us\Plex\Movies\ | Where-object {$_.PSIsContainer} | Foreach-Object {$_.Name}

在这里,代码将导航到我的 Plex 电影文件夹并将每个文件夹名称保存到名为的数组中$PlexMovieFolders

$List1 = Get-ChildItem -Path F:\ -Name -File -Exclude *.srt,*.DS_Store,*.dat,*.jpg

因为我用来提取电影的驱动器只有根目录中的文件,所以我在这里所做的就是获取每个电影名称并将其保存到名为的数组中$List1

$List2 = @()
$Match = @()
$No_Match = @()

本节将脚本后面要用到的一系列其他变量设置为数组。

for ($i1 = 0; $i1 -le ($PlexMovieFolders.length - 1); $i1 += 1){
    $SubFolders = @()
    $folder = $PlexMovieFolders[$i1]
    $List2 += Get-ChildItem -path \\Tower.pauk.us\Plex\Movies\$folder\ -Name -File -Exclude *.srt,*.DS_Store,*.dat,*.jpg
    $SubFolders = Get-ChildItem \\Tower.pauk.us\Plex\Movies\$folder\ | Where-object {$_.PSIsContainer} | Foreach-Object {$_.Name}
    if ($SubFolders.Length -gt 0) {
            for($i2 = 0; $i2 -le ($SubFolders.Length - 1); $i2 += 1){
                $folder2 = $SubFolders[$i2]
                $List2 += Get-ChildItem -Path \\Tower.pauk.us\Plex\Movies\$folder\$folder2\ -Name -File -Exclude *.srt,*.DS_Store,*.dat,*.jpg
    }
    }
}

这是一个 for 循环。它将对数组中的每个项目循环一次$PlexMovieFolders。这里有很多事情要做,所以我将尝试稍微分解一下...

$SubFolders = @()

因为有时每个字母内都有子文件夹,所以我需要一个变量,该变量可以包含每个字母的每个子文件夹的数组。我假设将此变量放在 for 循环的顶部将在每次运行循环时清除数组。

$folder = $PlexMovieFolders[$i1]

这会将变量设置为$PlexMovieFolders循环所在的数组中的单个项。我这样做是因为$PlexMovieFolder[$i1]在实际命令中使用会给我带来问题。

$List2 += Get-ChildItem -path \\Tower.pauk.us\Plex\Movies\$folder\ -Name -File -Exclude *.srt,*.DS_Store,*.dat,*.jpg

本部分将介绍 Plex 的 \Movies\ 文件夹中的每一个字母文件夹。从那里,它将每个文件名保存到一个数组中,但不包括一些不必要的文件。

$SubFolders = Get-ChildItem \\Tower.pauk.us\Plex\Movies\$folder\ | Where-object {$_.PSIsContainer} | Foreach-Object {$_.Name}

这将进入字母文件夹并抓取所有文件夹名称,然后将其保存到名为的数组中$SubFolders。每次循环运行时都会清除该数组,因为每个字母文件夹都有自己的子文件夹。此部分是问题部分。因为出于某种原因,只有在此脚本中运行时,它才会抓取看似随机但始终相同的文件夹,并将文件夹名称的每个字母作为单独的项目存储在数组中。

例如:它将Rambo Movies以整个文件夹名称保存。

但是当它尝试将“昆汀·塔伦蒂诺收藏”保存在数组中时,它会像这样保存:

Q
u
e
n
t
i
n

T
a
r
a
n
t
i
n
o

C
o
l
l
e
c
t
i
o
n

这非常令人沮丧,因为当我运行:$SubFolders = Get-ChildItem \\Tower.pauk.us\Plex\Movies\@\ | Where-object {$_.PSIsContainer} | Foreach-Object {$_.Name}在 powershell 终端中它工作正常...我不确定我做错了什么。这就是为什么我希望得到一些反馈。

if ($SubFolders.Length -gt 0) {
            for($i2 = 0; $i2 -le ($SubFolders.Length - 1); $i2 += 1){
                $folder2 = $SubFolders[$i2]
                $List2 += Get-ChildItem -Path \\Tower.pauk.us\Plex\Movies\$folder\$folder2\ -Name -File -Exclude *.srt,*.DS_Store,*.dat,*.jpg
    }
    }

此部分将查看数组的长度是否$SubFolders大于 0,如果是,它将进入该子文件夹并将每个文件名保存到名为的数组中,$List2该数组不会在每次循环运行时清除,因为我最后需要完整的电影列表。

for ($i2 = 0; $i2 -le ($List2.length - 1); $i2 += 1){
    for ($i1 = 0; $i1 -le ($List1.length - 1); $i1 += 1){
        if($List1[$i1] -eq $List2[$i2]){
            $Match += $List1[$i1]
        }else{
            $No_Match += $List1[$i1]
        }
    }
}

这是目前为止的最后一部分...这里有一些内容。我们正在查看的是“比较器”,它将检查每个项目,$List2看看是否有任何项目$List1与其匹配。如果有匹配,请将其保存在$Match数组中,以便我稍后验证。如果没有匹配,请将其保存在$No_Match。稍后我将使用此$No_Match数组将这些电影自动复制到 plex Movie 文件夹中。

TLDR; $SubFolders = Get-ChildItem \\Tower.pauk.us\Plex\Movies\$folder\ | Where-object {$_.PSIsContainer} | Foreach-Object {$_.Name} 有时会抓取文件夹名称字符而不是文件夹名称。例如:

Q
u
e
n
t
i
n

T
a
r
a
n
t
i
n
o

C
o
l
l
e
c
t
i
o
n

但如果我手动输入变量,他的命令就可以正常运行。例如: $SubFolders = Get-ChildItem \\Tower.pauk.us\Plex\Movies\Q\ | Where-object {$_.PSIsContainer} | Foreach-Object {$_.Name} 将另存为Quentin Tarantino Collection

更新(2019 年 12 月 30 日):

由于 Keith Miller 的一些帮助,我能够将总代码量减少约一半。

我没有用它收集文件信息。我还添加了电视节目。

$NewMovieDir = 'F:\'
$NewShowDir = 'D:\TV'


$Movies_New = (Get-ChildItem -Path $NewMovieDir -File -Recurse -Exclude *.srt,*.DS_Store,*.dat,*.jpg).Name
$Movies_Old = (Get-ChildItem -Path \\Tower.pauk.us\Plex\Movies -File -Recurse -Exclude *.srt,*.DS_Store,*.dat,*.jpg).Name
$Shows_New = (Get-ChildItem -Path $NewShowDir -File -Recurse -Exclude *.srt,*.DS_Store,*.dat,*.jpg).Name
$Shows_Old = (Get-ChildItem -Path '\\Tower.pauk.us\Plex\Tv Shows' -File -Recurse -Exclude *.srt,*.DS_Store,*.dat,*.jpg).Name

更新(2020 年 1 月 4 日):

我遇到了一个问题。我的摄取驱动器中的某些电影的格式与 Plex 文件夹中的电影的格式不同。例如。我尝试将命名方案保留为Title (year).xyz(Elf (2003).mp4)。有时我的摄取驱动器中的电影看起来不像Title (year).xyz,但它们是Title.xyz。因此,当我尝试比较这些项目时,我得到了很多错误的不匹配。为了解决这个问题,我决定尝试删除标题后的所有内容并完全不添加年份。我的代码如下:(Get-ChildItem -Path $NewMovieDir -File -Recurse -Exclude *.srt,*.DS_Store,*.dat,*.jpg).Name | ForEach-Object {$_ -replace '\([^\)]+\)'} | ForEach-Object {$_.TrimEnd()}这在删除 (YYYY) 方面做得很好,但在删除尾随空格方面做得很糟糕。任何帮助都非常感谢!

相关内容