我正在尝试使用PowerShell脚本以递归方式从文件和文件夹中删除某些字符。下面是我找到的脚本,但它只会从文件中删除下划线,而不是文件夹。有一些字符需要删除,但如果需要,我可以为每个字符添加一个脚本。它以递归方式更改文件夹中的文件,但没有文件夹被“修复”。
当前的PowerShell脚本:
'dir -Recurse | where {-not $_.PsIscontainer -AND $_.name -match "_"} | foreach {
$New = $_.name.Replace("_","")
Rename-Item -path $_.Fullname -newname $New -passthru
}'
答案 0 :(得分:1)
正如评论中所指出的,您的问题的核心是您使用-Not $_.PsIscontainer
块的Where
组件排除文件夹。
dir -recurse | where {$_.name -match "_"} | ...
您遇到的第二个问题很可能是,由于您要更改文件夹名称,因此先前使用dir
/ Get-ChildItem
进行清点的子项将具有不正确的路径。解决此问题的一种方法是首先处理文件然后处理文件夹。
$filesandfolders = Get-ChildItem -recurse | Where-Object {$_.name -match "_"}
$filesandfolders | Where-Object {!$_.PsIscontainer} | foreach {
$New=$_.name.Replace("_","")
Rename-Item -path $_.Fullname -newname $New -passthru -WhatIf
}
$filesandfolders | Where-Object {$_.PsIscontainer} | foreach {
$New=$_.name.Replace("_","")
Rename-Item -path $_.Fullname -newname $New -passthru -WhatIf
}
绝不是最漂亮的解决方案,但它会起作用。它首先处理所有文件,然后处理文件夹。当您确定它会按预期执行时,删除-Whatif
其他字符
您曾提到过您要删除的其他字符。这不是一个很高的要求。你可能正在使用正则表达式,所以让我们试试。
$characters = "._"
$regex = "[$([regex]::Escape($characters))]"
$filesandfolders = Get-ChildItem -recurse | Where-Object {$_.name -match $regex}
$filesandfolders | Where-Object {!$_.PsIscontainer} | foreach {
$New=$_.name -Replace $regex
Rename-Item -path $_.Fullname -newname $New -passthru -WhatIf
}
$filesandfolders | Where-Object {$_.PsIscontainer} | foreach {
$New=$_.name -Replace $regex
Rename-Item -path $_.Fullname -newname $New -passthru -WhatIf
}
这将删除这些文件和文件夹中的所有句点和下划线。
未经测试,但您甚至可以将其归结为这几行
$characters = "._"
$regex = "[$([regex]::Escape($characters))]"
$filesandfolders = Get-ChildItem -recurse | Where-Object {$_.name -match $regex}
$filesandfolders | Where-Object {!$_.PsIscontainer} | Rename-Item -NewName ($_.name -Replace $regex) -PassThru -WhatIf
$filesandfolders | Where-Object {$_.PsIscontainer} | Rename-Item -NewName ($_.name -Replace $regex) -PassThru -WhatIf