在部分文件名匹配时将文件复制到新创建的文件夹中

Copy files into newly created folders on partial filename match

大家好,因为我已经达到了 powershell 知识的极限。

我有一个包含超过 200,000 个文件的目录,我需要将与文件名部分匹配的所有文件复制到我已经使用此脚本创建的文件夹中

Set-Location "C:\Users\joshh\Documents\Testing Environment" 
$Folders = Import-Csv "C:\Users\joshh\Documents\Weichert.csv" 
ForEach ($Folder in $Folders) { 
New-Item "myfilepathhere$($Folder.folderName)" -type directory 
}

更新: 这是文件名的示例:

TH-246-02050-LOL-SQ-ALT2.png
TH-246-02050-WHT-H.png
TH-247-02050-EMB-LOD.png
TH-246-02050-LOL-H-ALT2.png
TH-246-02050-LOL-SQ.png
TH-246-02050-LOL-SQ-ALT.png
TH-247-02050-EMB-LOD-ALT.png
TH-247-02050-EMB-LOL.png
TH-247-02050-EMB-LOL-ALT.png
TH-247-02050-LOD-H.png

以上是文件名的示例,我需要复制所有包含 -EMB- 的文件并将它们移动到另一个目录中与该文件名的前 12 个字符匹配的文件夹中(例如 TH-247- 02050)

更新: 如果文件夹不存在,则创建一个包含文件名前 12 个字符的文件夹。 请注意,前 12 个字符有很多变体,有些以 RM、KW 等开头。

这是我目前所知道的,但我知道 Move-Item 部分并不是我想要的

$source = "targetPath"
$destination = "targetPath2"

$embFiles = @(Get-ChildItem ${source}/*EMB* -File | Select-Object -ExpandProperty FullName)
foreach($file in $embFiles) {
    if($file | Where-Object { $_ -clike "*EMB*" }){
    Move-Item -Path $source -Destination $destination
        }
}

我们将不胜感激任何帮助!

这是您可以做到的一种方法:

  1. 获取名称中包含-EMB-的所有文件:-Filter *-EMB-* -File.
  2. 将所有这些文件按 -EMB- 之前的所有内容分组,这里我们可以使用 Group-Object -AsHashTable and a calculated expression using Regex.Match. See https://regex101.com/r/iOoBJS/1 了解详细信息。
  3. 遍历 哈希 tableKeys,每个 Key将是文件组的 名称 目标文件夹(即:TH-247-02050)。
  4. 将目标路径($destinationPath2)与目标文件夹名称($folder)连接起来,这里我们可以使用Join-Path and check if this joined path exists, if it doesn't, create a new folder with New-Item.
  5. 最后,我们可以将所有文件(每个 KeyValues 从散列 table 移动到他们的相应的目的地。
$source      = "targetPath"
$destination = "targetPath2"

$map = Get-ChildItem $source -Filter *-EMB-* -File | Group-Object -AsHashTable -AsString {
    [regex]::Match($_.BaseName, '(?i).+(?=-EMB-)').Value
}

foreach($folder in $map.Keys) {
    $d = Join-Path $destination -ChildPath $folder
    $d = New-Item $d -ItemType Directory -Force
    # -WhatIf can be removed once you have checked the script is doing what you want
    $map[$folder] | Move-Item -Destination $d -WhatIf -Verbose
}
由于错误,

-AsString 在 Windows PowerShell 中是必需的。