windows PowerShell脚本,用于将文件放置在名称中包含字符串的目录中

unftdfkk  于 2023-01-21  发布在  Windows
关注(0)|答案(2)|浏览(148)

我有大约300个文件,命名格式为:
十一月Foo酒吧和东西[最终版本]. pdf
十一月Foo酒吧和东西[草案]. pdf
[最终版]. pdf
[草案]. pdf '
它们都以"November"开头,以括号中的单词结尾,但这个单词会略有不同。
我有大约150个相应的目录,格式如下:
"Foo酒吧之类的"
"洛鲁姆·伊普苏姆"
我想将文件移到具有相关名称的文件夹中。
换句话说,
1.仅搜索"November"和"["之间的文本字符串
1.将1中的字符串与目录列表进行匹配
1.找到匹配项后,将文件移动到相应的目录
1.如果未找到匹配项,请跳过并继续到下一个文件
完成后,我应该将所有与Foo Bar And Stuff相关的文件放在一个目录中,而将Lorum Ipsum文件放在另一个目录中,而不是简单的文件列表。
假设文件位于c:\files中,目录位于c:\directories中
我试着在Explorer中手动移动这些,这很乏味。

7dl7o3gd

7dl7o3gd1#

使用正则表达式:

$filenames = @("November Foo Bar And Stuff [Final Version].pdf", "November Foo Bar And Stuff [Draft].pdf", "November Lorum Ipsum [Final].pdf", "November Lorum Ipsum [Draft].pdf")
$pattern = "(?<filename>November[^\[]+)"
foreach($filename in $filenames)
{
   $match = select-string $pattern -inputobject $filename 
   Write-Host '$match.Matches'
   $match.Matches

   Write-Host "filename = " $match.Matches.Value.Trim()
}
fkvaft9z

fkvaft9z2#

你可以这样做:

$destination = 'C:\directories'

# because the files have square brackets in their name, use `-LiteralPath`
Get-ChildItem -LiteralPath 'C:\Files' -Filter 'November*.pdf' -File | ForEach-Object {
    # filter the folder name from the file BaseName
    $folderName   = ($_.BaseName -replace '^November([^\[]+).*', '$1').Trim()
    $targetFolder = Join-Path -Path $destination -ChildPath $folderName
    if (Test-Path -Path $targetFolder -PathType Container) {
        $_ | Move-Item -Destination $targetFolder -Force
    }
}

为了通过不在每个迭代中测试目标文件夹的存在性来加快速度,您还可以首先获得目标目录名称的列表,如下所示:

$destination = 'C:\directories'
$targets     = (Get-ChildItem -Path $destination -Directory).Name
# because the files have square brackets in their name, use `-LiteralPath`
Get-ChildItem -LiteralPath 'C:\Files' -Filter 'November*.pdf' -File | ForEach-Object {
    # filter the folder name from the file BaseName
    $folderName   = ($_.BaseName -replace '^November([^\[]+).*', '$1').Trim()
    if ($targets -contains $folderName) {
        $targetFolder = Join-Path -Path $destination -ChildPath $folderName
        $_ | Move-Item -Destination $targetFolder -Force
    }
}

相关问题