簡體   English   中英

如何使用PowerShell比較文件夾和數組中的子字符串?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM