2017-07-06 176 views
0

我有幾十萬個文件位於〜40個文件夾中(這些子文件夾位於同一個超文件夾中,我將稱之爲'測試')。我試圖使用PowerShell來替換文件夾名稱中找到的語法,但也使用文件名。Windows批處理文件和文件夾重命名Powershell

基本上我的文件夾和文件中包含的字符「PXXXX_0」相同的字符串,我想批量重命名「PXXXX_」

這裏是我以前首先映射文件的興趣&文件夾中的代碼

cd C:\test 

Get-ChildItem -Filter "*PXXXX_0*" -Recurse | Rename-Item -NewName {$_.name -replace 'PXXXX_0', 'PXXXX_'} -whatif 

這給了我正確的文件和預覽的動作(例如

What if: Performing operation "Rename File" on Target "Item: C:\test\PXXXX_053\PXXXX_053_558.jpg Destination C:\test\PXXXX_053\PXXXX_53_558.jpg 

所以這似乎工作,但只有上的文件在我也想重命名的文件夾中。

現在,如果我啓動代碼,而不-whatif似乎只有文件夾名稱命名,而不是文件...

我敢肯定,我錯過了一些東西,但因爲我沒有真正熟悉的語言,我正在努力尋找解決方案。我正在使用Powershell v1.0

感謝您的任何幫助。

最佳

+4

假定文件夾重命名後,文件夾內的文件路徑是錯誤的,因爲該文件夾不再存在該名稱下。先嚐試重命名文件,方法是過濾'.. -Recurse | where-object {-not $ _。PsIsContainer} |重命名 - 項目..'然後重做它來重命名文件夾,也許? – TessellatingHeckler

+0

謝謝,它像一個魅力工作! – Rhiz

回答

0

一個內膽:

$items = get-childitem -filter "*PXXXX_0*" -Recurse; foreach ($item in $items) { $newName = $item.fullname -replace 'PXXXX_0', 'PXXXX_'; rename-item $item.fullname -NewName $newName; } 

容易的眼球:

$items = get-childitem -filter "*PXXXX_0*" -Recurse; 
foreach ($item in $items) { 
    $newName = $item.fullname -replace 'PXXXX_0', 'PXXXX_'; 
    rename-item $item.fullname -NewName $newName; 
} 

總之,PowerShell中1試圖將該文件與歌曲名稱,而不是重命名完整路徑。基本上,它們在子文件夾中時無法找到您的文件。

我在v5中測試了您的邏輯,它的工作原理與您預期的相似。

我打算在這裏假設並假設您正在嘗試通過System Center Orchestrator運行此腳本,因爲您正在使用PowerShell v1。我感到很痛苦。我建議將所有PS腳本包裝到invoke-command -scriptblock {} -Credential $myCreds塊中。這將促進執行到目標系統的PowerShell版本。它還使得在-ComputerName上運行腳本而非Runbook服務器非常容易。

然後,您可以將用戶名和密碼對存儲爲Orchestrator變量(使用加密選項)並將它們插入上述get-credential語句中。起初感覺非常混亂,但你已經習慣了。

測試這個,我跑PowerShell和-version 1.這是我的$ PSVersionTable:

Name       Value 
----       ----- 
CLRVersion      2.0.50727.8689 
BuildVersion     6.1.7600.16385 
PSVersion      2.0 
WSManStackVersion    2.0 
PSCompatibleVersions   {1.0, 2.0} 
SerializationVersion   1.1.0.1 
PSRemotingProtocolVersion  2.1 

它有同樣的問題,但它可能不是1對1的比賽什麼Orchestrator是要運行。發佈輸出,如果它不工作,我會盡我所能。