我需要在文件共享中批量重命名文件
~
和目标是将波浪号替换为简单的-
,保留文件扩展名(如果有),但将其转换为小写字母。
我在查找文件的脚本的第一部分中取得了成功
$PATH = "\\<Fileservername>\<Folder>\"
$pattern = "*~*"
Get-ChildItem $PATH -Recurse | where {$_.Name -like $pattern}
我正在努力的是脚本的第二部分重命名。 我在这里找到了两个主题:
我无法适应这些解决方案,另外可能需要采取其他步骤,才能将给定的文件名从大写字母转换为小写字母,如果文件没有文件扩展名,则跳过此操作。< / p>
一个示例是将ACUJLH~H
重命名为ACUJLH-H
,将KYA3BM~Q.PDF
重命名为KYA3BM-Q.pdf
。
答案 0 :(得分:2)
这是我的贡献。我已将-File
开关添加到Get-ChildItem
cmdlet,因此它将仅查找文件,并且不会尝试处理目录名称。
另外,我将替换模式更改为~+
,因此具有重复波浪号的文件将被替换为单个-
字符。 (KYA3BM~~~~Q.PDF
变成KYA3BM-Q.pdf
)
$path = "D:\Code\PowerShell\StackOverflow"
$pattern = "*~*"
Get-ChildItem $path -Recurse -File | Where-Object {$_.Name -like $pattern} |
ForEach-Object {
$directory = $_.DirectoryName # or [System.IO.Path]::GetDirectoryName($_.FullName) or use Split-Path $_.FullName -Parent
$filename = $_.BaseName -replace '~+', '-' # or [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -replace '~+', '-'
$extension = $_.Extension # or [System.IO.Path]::GetExtension($_.Name)
if (![string]::IsNullOrEmpty($extension)) { $filename += $extension.ToLower() }
$newname = Join-Path -Path $directory -ChildPath $filename
Rename-Item -LiteralPath $_.FullName -NewName $newName -Force
}
答案 1 :(得分:0)
您将需要过滤符合条件的文件。然后使用ForEach-Object
比较扩展名并为每个找到的项目建立新的文件名。最后,使用Rename-Item
cmdlet进行更改。
$PATH = '\\<Fileservername>\<Folder>\'
Get-ChildItem $PATH -Recurse -Include '*~*' | ForEach-Object {
[String]$Extension = [System.IO.Path]::GetExtension($_)
[String]$NewFileName = [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -replace '~','-'
if ($Extension){ $NewFileName += $Extension.ToLower() }
Rename-Item $_.FullName $(Join-Path ([System.IO.Path]::GetDirectoryName($_)) $NewFileName) -Force
}