2014-04-21 164 views
0

我想使用該模式一次執行所有8k +文件,因爲文件的左邊5個字符與要移動到的子目錄的右邊5匹配。Powershell基於文件名將文件從目錄移動到子目錄

此工程一個接一個:

move-item -path X:\"Property Files"\05165*.pdf -destination X:\"Property Files"\"* -- 05165"; 
move-item -path X:\"Property Files"\05164*.pdf -destination X:\"Property Files"\"* -- 05164"; 

預先感謝您的任何幫助。

回答

0

作爲一個內膽,假設目標文件夾已經存在:

Get-ChildItem "X:\Property Files\*.PDF" | 
ForEach { move -path $_ -destination ($_.directoryname +"\* -- "+ $_.Name.substring(0,5))} 

僅使用文件名,你只要提取前五個字符(substring(0,5)),然後用它作爲要匹配的文件夾的結尾。
$_.Directoryname假設目標文件夾是源路徑的子文件夾。

+0

非常感謝。它工作完美。我在使用*之前的5位數字前嘗試了幾個文件,然後讓它放到整個目錄中,當它測試出來作爲工作時,我只把星號放回去,然後回車。我的機器花了大約一個小時,但比以前快了很多。欣賞節省時間。 :-) – user3516394

0

好的,你在正確的道路上整個RegEx標籤在這裏。我所做的是查找所有內容,直到最後一個反斜槓,然後捕獲5個數字,然後是所有不是反斜線的行,直到行尾,並且只返回捕獲的組。我將其設置爲變量$ItemNumber,並將其用於目的地。我在ForEach循環中運行目標源文件夾中的所有內容。這裏是我結束了代碼:

ForEach($File in (GCI "X:\Property Files\*.PDF")){ 
$ItemNumber = $File.Fullname -replace ".+?\\(\d{5})[^\\]*$", "`$1" 
move-item -path X:\"Property Files"\05165*.pdf -destination X:\"Property Files"\"* -- $ItemNumber" 
} 

你可以做到這一點通過管如果你想,像這樣:

GCI "X:\Property Files\*.PDF"|%{move-item -path X:\"Property Files"\05165*.pdf -destination X:\"Property Files"\"* -- $($_.Fullname -replace ".+?\\(\d{5})[^\\]*$", "`$1")"} 

但是得到那種長,有的人真的不就像那麼長的一條線。

RegEx可以測試here,再加上它打破了一切。 (鏈接到regex101.com解釋)

+0

也欣賞你的幫助。我正在尋找一個批處理過程,並不需要對每個文件進行命名,所以這並不完全符合法案。很高興知道正則表達式網站。 – user3516394

+0

這不應該重命名文件,只需移動它們,但我很高興您找到了適合您的解決方案。 – TheMadTechnician

相關問題