[英]How to compare substrings within a folder and an array with PowerShell?
我有一個包含100,000個文件(圖片)的文件夾,這些文件由其UPC代碼(8到14個數字),下划線和其他數字命名:
000012345678_00_1
我在Word文檔中有20,000個唯一的UPC代碼列表(用逗號分隔),該列表應與這些圖片的五分之一匹配(我在Excel表中也有此列表)。
000000000000, 000000000001, 000000000011
我想做的是在數組(20,000個元素的列表)和文件夾中的文件之間找到匹配項,以便僅從文件夾中提取這20,000張圖片。
我首先將文件名削減為“ __”,以便僅獲取文件名的相關部分:
$FName = ($File -split '_')[0]
為了使事情變得更困難,我還需要在數組中的元素上添加通配符“ *”,因為可能已經在文件名的開頭添加了一些額外的“ 0”,但這些不存在於我們的數組中。 例如,數組“ 05713901”中的該UPC引用此文件名“ 00005713901_00.png”; 因此要找到匹配項,我將不得不使用“ like”運算符。
然后,當我找到那些匹配項時,只需要使用Move-Item到新文件夾或子文件夾即可。
這是我開始編寫但沒有任何結果的代碼:
$Directory = "C:path_to_my_folder";
$AllFiles = Get-ChildItem $Directory
$FileNames = New-Object System.Collections.ArrayList;
foreach($File in $AllFiles)
{
$FName = ($File -split '_')[0]
$FileNames.Add($FName)
}
$Upc = Get-Content C:\path_to_my_word.docx
Compare-Object $FileNames $Upc
您無法使用Get-Content
讀取docx
文件,即使這樣做, Compare-Object
也無法正常工作,因為您的Word文件是由UPC代碼組成的列表,以逗號分隔(在Powershell中為單個string
),而$FileNames
是一個數組(多個對象)。
將UPC代碼從excel復制到記事本,以便獲得一個簡單的文本文件,每行一個代碼,類似於此示例。
UPC.txt-內容:
000000000000
000000000001
000000000011
....
通過20.000個類似-like
測試循環運行100.000個文件將花費很長時間。 我將創建一個正則表達式模式,該模式查找末尾帶有下划線的任何代碼。 例如:
$Directory = "C:\path_to_my_folder";
$AllFiles = Get-ChildItem $Directory
#Generate regex that matches 00001_ or 00002_ etc. Trimming leading and trailing whitespace just to be safe.
$regex = ((Get-Content -Path "c:\UPC.txt") | ForEach-Object { "$($_.Trim())_" }) -join '|'
#Get files that match
$AllFiles | Where-Object { $_.Name -match $regex } | ForEach-Object {
#Do something, ex. Move file.
Move-Item -Path $_.FullName -Dest C:\Destination
}
或者干脆
$AllFiles | Where-Object { $_.Name -match $regex } | Move-Item -Destination "C:\Destination"
將您的UPC代碼另存為純文本文件。 正如Frode F.建議的那樣,將它們從Excel復制到記事本可能是最簡單的方法。 保存該列表。 然后,我們將該列表加載到PowerShell中,對於每個文件,我們將像您一樣在下划線處進行拆分,並修剪所有前導零,然后檢查它是否在已知代碼列表中。 使用Move-Item
已知UPC列表中的任何文件
#Import Known UPC List
$UPCList = Get-Content C:\Path\To\UPCList.txt
#Remove Leading Zeros From List
$UPCList = $UPCList | ForEach{$_.TrimStart('0')}
$Directory = "C:path_to_my_folder"
Get-ChildItem $Directory | Where{$_.Name.Split('_')[0].TrimStart('0') -in $UPCList} | Move-Item -Dest C:\Destination
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.