簡體   English   中英

使用powershell將多個文件夾重命名為大寫而不是文件

[英]rename multiple folder to Uppercase not files using powershell

我正在使用 powershell,其中有多個文件夾,我需要將所有文件夾名稱更改為大寫,而不是僅文件文件夾。

我試過下面的代碼

Get-ChildItem -Path "C:\Users\Xyz\Desktop\sample" -Recurse | % { 
  if ($_.Name -cne $_.Name.ToUpper()) { ren $_.FullName $_.Name.ToUpper() } 
}

但是使用此代碼它只更改文件名但我只想更改目錄

例如

在此處輸入圖片說明

文件夾名(小寫)

abc
cab
dab

像這樣(大寫)

ABC
CAB
DAB

提前致謝

這些技巧可能並不明顯。 這個怎么樣? 嗯,這實際上不起作用。 您不能在 powershell 中以大寫形式將文件夾重命名為相同的內容。

# doesn't work!
get-childitem -recurse -directory -path "C:\Users\Xyz\Desktop\sample" | 
  Rename-Item -NewName { $_.name.toupper() } -whatif

有時從 powershell 調用 cmd 效果更好。 首先嘗試將其作為“whatif”,看看它是否符合您的要求。 如果我真的理解這個問題。 所有這些都是回顯字符串。 這個命令只是“假裝”。

get-childitem -recurse -directory -path "C:\Users\Xyz\Desktop\sample" | 
  foreach { write-host cmd /c ren $_.fullname $_.name.toupper() }

如果這看起來不錯,這實際上是重命名。 但是如果出現問題,也許可以進行備份。 能夠撤消操作。

get-childitem -recurse -directory -path "C:\Users\Xyz\Desktop\sample" | 
  foreach { cmd /c ren $_.fullname $_.name.toupper() }
  • 要將Get-ChildItem的輸出僅限於目錄,請使用-Directory開關(PSv3+;在 PSv2 中,管道到Where-Object { $_.PSIsContainer }

  • 除此之外,您的解決方案應該可以工作,但不是由於.NET 的System.IO.DirectoryInfo.MoveTo()方法(以及System.IO.Directory.Move()方法)中的概念缺陷,PowerShell 的Rename-Item從 .NET Core 3.0 preview6 / .NET 4.8開始Rename-Item cmdlet 基於

    • 該方法無法將目錄名稱的大小寫變體識別為不同的名稱,並且因Source and destination path must be different失敗。

      • 奇怪的是,正如您所經歷的那樣,文件沒有受到影響。 [1]
    • 當然,雖然 NTFS不區分大小寫,但它也保留大小寫,因此應該可以將foo重命名為FOO ,例如。

解決方法(PSv4+):

注意: js2010 的有用答案提供了另一種解決方法,它基於為每個輸入文件夾調用cmd.exe以使用其ren命令。 雖然它在概念上更簡單,但需要注意的是,這種為每個處理的文件夾創建子進程的方法效率低下且速度緩慢。 也就是說,對於偶爾可能無關緊要的重命名操作。

$path = 'C:\Users\Xyz\Desktop\sample'

Get-ChildItem -LiteralPath $path -Recurse -Directory |
  Where-Object { $_.Name -cne $_.Name.ToUpper() } -PipelineVariable dir |  
    Rename-Item -PassThru -NewName { [IO.Path]::GetRandomFileName() } |
      Rename-Item -NewName { $dir.Name.ToUpper() }

該解決方法將匹配的文件夾臨時重命名為一個臨時的、隨機生成的名稱 ( [IO.Path]::GetRandomFileName() ),然后應用原始名稱的全大寫版本。

輸入文件夾的原始狀態和名稱是通過變量$dir捕獲的,該變量被“隱藏”以供以后通過公共-PipelineVariable參數使用。


[1] 警告:當您使用Get-ChildItemGet-Item按字面名稱報告特定目錄或文件時,您指定的任何大小寫變體都會被報告回來,即使存儲在文件系統中的真實大小寫變體可能不同(相比之下,文件資源管理器總是向您顯示真實情況)。 要查看真實情況,請使用
Get-ChildItem <parentDir> -Filter <name>
或者,作為可能顯示其他項目的快速解決方法,但是,將*附加到名稱/路徑。 在這兩種情況下,名稱都被視為通配符模式,匹配過程的結果反映了真實情況。

如何雙引號文件夾名稱? 有些文件夾有空格...

寫主機 cmd /c ren $ .fullname $ .name.toupper()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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