2012-03-29 50 views
0

我最近開始使用PowerShell的,因爲我覺得它非常有用和強大的:)PowerShell的 - 包含一個值

Recursivly改變路徑,這是該方案: 客戶有用來在它的逗號的文件夾結構。 由於最新的程序添加,由於逗號,此操作失敗。 從本質上講,他們只是想用逗號替換「 - 」

這就是我所擁有的......它可以工作,但我覺得它效率低下。 該腳本完成應有的功能,但只要改變了一個路徑,剩下的就會失敗,因爲原來的路徑已經改變了,你跟着我? :)

$folderpath = "C:\pathcontainingcomma" 
foreach ($i in get-childitem $folderpath -Recurse) { 
    $name = $i.name.replace(","," - ") 
    Rename-Item -Path $i.fullname -NewName $name -Force -Verbose 
} 

我希望我解釋說不夠好,請提問,如果您有任何:)

回答

1

您將需要由內而外重新命名,以避免改變你仍然需要處理的路徑,所以我猜下面應該工作:

$folderpath = 'C:\pathcontainingcomma' 
$items = Get-ChildItem -Recurse $folderpath 
[Array]::Reverse($items) 
$items | ForEach-Object { Rename-Item -Path $_ -NewName ($_ -replace ',', '-') -Force -Verbose } 
+0

無法將參數綁定到參數'Path',因爲它爲空。 我們在這裏錯過了什麼嗎?我沒有看到$我任何地方要麼..而且它不是$項目,然後我得到這個錯誤: Rename-Item:無法將'System.Object []'轉換爲參數所需的類型'System.String' '路徑'。指定的方法 od不支持。 它應該是$ items.Name例如? – 2012-03-29 06:48:37

+1

對不起,你的代碼太忠實了。我剛剛使用管道重寫了它,因爲我認爲'foreach(){}'通常不是PowerShell中非常習慣的解決方案。 – Joey 2012-03-29 07:05:19

+0

不,'$ items'是一個數組(它在實際循環之前被反轉)。 'ForEach-Object'允許通過'$ _'訪問當前的管道元素(通常在涉及腳本塊的管道中)。 – Joey 2012-03-29 07:07:08

1

試試這個:

Get-ChildItem $folderPath -r '*,*' -name | foreach { 
$p = "$folderPath\$_"; rename-item $p ($p -replace ',',' - ') -whatif } 

-Name參數在此處非常方便,因爲輸出順序爲-Name將允許您首先重命名較高級目錄,而替換則在您通過輸出進行foreach時修復路徑的所有元素。