用于从文件和文件夹中删除字符的PowerShell脚本

时间:2015-03-17 16:50:48

标签: powershell

我正在尝试使用PowerShell脚本以递归方式从文件和文件夹中删除某些字符。下面是我找到的脚本,但它只会从文件中删除下划线,而不是文件夹。有一些字符需要删除,但如果需要,我可以为每个字符添加一个脚本。它以递归方式更改文件夹中的文件,但没有文件夹被“修复”。

当前的PowerShell脚本:

'dir -Recurse | where {-not $_.PsIscontainer -AND $_.name -match "_"} | foreach {
        $New = $_.name.Replace("_","")
        Rename-Item -path $_.Fullname -newname $New -passthru
    }'

1 个答案:

答案 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