2016-03-08 11 views
1

我有100,000個文件(圖片),這是由他們的UPC代碼命名(8到14個數字),其次是下劃線和其他數字的文件夾:如何使用PowerShell比較文件夾和數組中的子串?

000_00_1 

我有20,000獨特的UPC列表代碼在一個單詞文件(用逗號隔開),應該匹配這些圖片的五分之一(我也有一個Excel表格中的這個列表)。

000000000000, 000000000001, 000000000011 

我想要做的,就是找到(20000個元素列表)和文件,我的陣列之間的匹配我的文件夾中,以提取只能從文件夾中的圖片20000。

我已經被切割的文件名達啓動了「__」,從而只得到文件名的相關部分:

$FName = ($File -split '_')[0] 

爲了使事情變得更難,我還需要添加對數組中的元素使用通配符「*」,因爲文件名開頭的一些額外的「0」可能已被添加並且不存在於我們的數組中。例如,數組「05713901」中的這個UPC指的是這個文件名「00005713901_00.png」;所以要找到匹配我將不得不使用「like」運算符。

後來,當我發現那些比賽,我就不得不使用布展項目到一個新的文件夾或子文件夾。

這是我開始的代碼沒有任何結果:

$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 
+0

任何文件'比較-Object',只是要告訴你2個陣列是否嚴絲合縫(他們不會,他們是不同大小的哪個) ,或者哪些條目*不符合您的期望。 –

+0

感謝您的澄清!還有一個命令,我現在明白了:) – Sasandre

回答

0

您無法讀取docx -file使用Get-Content,即使它沒有,Compare-Object不會因爲你的話工作文件是以逗號分隔的UPC代碼列表(Powerhell中的單個string),而$FileNames是一個數組(多個對象)。

複製從Excel UPC碼到記事本等你拿一個簡單的文本文件,每個類似於此採樣線一個代碼。

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" 
+0

按照你的意思去做。用20K的線我會去找一個文件來保持腳本清潔和動態,但那只是我。 :-)請記住接受你最終的答案。 –

+0

感謝您的回答! 我用Excel複製粘貼的UPC代碼創建了記事本文檔,但後來我決定將20,000個條目(使用逗號)作爲數組直接複製粘貼到PowerShell中! 您是否介意顯示一個示例或快速解釋移動文件cmd?當我使用它時,它將我父文件夾直接移動到C:/ user! – Sasandre

+0

哈哈是的,我意識到在PowerShell中有82頁長的文檔不會幫助我保持一個乾淨的腳本!但是我不確定如何組織內容以便將它從.txt組織到數組,直到您告訴我:) – Sasandre

0

保存您的UPC代碼作爲一個純文本文件。正如Frode F.所建議的,將它們從Excel複製到記事本可能是最簡單的方法。保存該列表。然後,我們將把這個列表加載到PowerShell中,並且對於每個文件,我們將像下劃線一樣分割下劃線,並修剪任何前導零,然後檢查它是否在已知代碼列表中。此舉是在已知的UPC的列表與Move-Item

#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 
+0

您如何計劃處理「000000000」?很好的向他展示兩種解決方案。我沒有測試過它,但我認爲正則表達式比運行20k模式要快100k倍。:-) –

+0

在你做兩個建議之後,我使用了你給我的腳本,但遇到了Move-管道之後的項目:移動 - 項目 (從法語翻譯PS的輸出:) PS抱怨輸入無法鏈接到任何命令參數,或者cmd不接受管道或者不能輸入管道或輸入它的屬性不匹配任何接受管道條目的參數: + CategoryInfo:ObjectNotFound :(C:\ ..:String)[Move-Item],ItemNotFoundException + FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.MoveItemCommand – Sasandre

+0

@FrodeF 。我的上面的例子並不是最好的:在excel列表中,沒有一個UPC代碼以1以上的零開始(你可以得到88888888或088888888,但不是0088888888)(是的,我手動查看了20,000個條目... )。 我還有一段時間(長時間工作!),所以如果需要的話,我可以運行1小時的程序。 但我很高興有這兩個解決方案,以便更好地瞭解PS如何工作:) – Sasandre

相關問題