使用Powershell重命名父母

时间:2019-03-20 22:06:28

标签: powershell rename

我有C:\ test1 \ test2 \ test3 \ test4 \ test5 \ test6 \ test7 \ test8

我需要重命名路径的每个文件夹,从最后一个(test8)到第一个(test1)。我必须使用最大长度的Windows 10文件夹进行测试,为此,我需要首先更改最后一个文件夹的名称(test8),然后更改其父文件夹(test7)。

我有此功能

[CmdletBinding()]
param(
    [string]$path
)


function createFolderStructure{

        $parentName = "F:\"
        $name = "ThisFolderHas256Characters_ThisFolderHas256Characters_"+
                "ThisFolderHas256Characters_ThisFolderHas256Characters_"+
                "ThisFolderHas256Characters_ThisFolderHas256Characters_"+
                "ThisFolderHas256Characters_ThisFolderHas256Characters_"+
                "ThisFolderHas256Characters_ThisFolderHas"

        for ($i=0; $i -lt 10; $i++){
            $parentName += "test\";
            New-Item "$parentName" -ItemType Directory;
        }

        Get-ChildItem -Path "F:\test" -Recurse -Force | ForEach-Object{
                Rename-Item -Path $_.fullname -NewName $name
            }
     }



createFolderStructure

但是我不知道如何使它从底部到顶部。就我所知,它不起作用,因为它从第一个文件夹转到最后一个文件夹,而在第二个文件夹上,我得到的名称例外,路径太长。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用函数递归执行此操作。我认为您可能需要缩短$ name变量:

Function Rename-Folders {
param([string]$path)

$name = "ThisFolderHas256Characters_ThisFolderHas256Characters_"+
                "ThisFolderHas256Characters_ThisFolderHas256Characters_"+
                "ThisFolderHas256Characters_ThisFolderHas256Characters_"+
                "ThisFolderHas256Characters_ThisFolderHas256Characters_"+
                "ThisFolderHas256Characters_ThisFolderHas"

if ($path -match "$($path | split-path -qualifier)\\?$") {
return
}
Get-Item -path $path | Rename-Item -NewName $name
Rename-Folders -path ($path | split-path)
}

$path = "F:\test1\test2\test3\test4"
Rename-Folders $path

答案 1 :(得分:-1)

首先,如您所述,存在字符限制。最后一个目录中任何文件的总路径长度不能超过256个字符,并且目录长度不能超过248个字符。您将为此进行一些检查。在前面,这意味着您的256个字符的文件夹名称永远不会起作用。曾经。

如果您知道完整路径是什么,并且只想沿目录结构向上移动到根文件夹,则可以对文件夹对象使用.Parent属性。

以下内容实际上只是一个概念证明,它将创建一个文件夹结构,并在其中嵌套文件,然后指定起点和终点,将从指定的最深的嵌套文件夹工作到目标文件夹,并将文件夹重命名为直到达到长度限制为止。

$NewName = 'ReallyExtremelyLongFolderName'
Remove-Item C:\Test -Recurse -Force -ea 0
Remove-Item "C:\$NewName" -Recurse -Force -ea 0

$RootFolder = "C:\test"
$TargetFolder = 'C:\test\Test\Test\Test\Test\Test\Test\Test\test'
New-Item "C:\test\Test\Test\Test\Test\Test\Test\Test\test\Test\Some Long File.xlsx" -force |Out-Null
$LongestFileName = Get-ChildItem $TargetFolder -recurse | Sort {$_.FullName.Length} | Select -last 1 -ExpandProperty FullName
$MaxLength = If((Get-Item $LongestFileName).PSIsContainer){248}Else{256}
$CurrentFolder = Get-Item $TargetFolder
$NewTarget = $TargetFolder
$VerbosePreference='Continue'
Do{
    Write-Verbose "Working on:                $($CurrentFolder.FullName)"
    $NewTargetTmp = $NewTarget.Replace($CurrentFolder.FullName,(Join-Path (split-path $CurrentFolder.FullName) $NewName))
    #Check new path for existing longest path
    Write-Verbose "Checking new longest path: $($LongestFileName.Replace($NewTarget,$NewTargetTmp))`nLength: $($LongestFileName.Replace($NewTarget,$NewTargetTmp).length)`n"
    If(($LongestFileName=$LongestFileName.Replace($NewTarget,$NewTargetTmp)).Length -gt $MaxLength) {Write-Warning "New target path to deepest nested file/folder too long:`n$LongestFileName";break}
    $CurrentFolder | Rename-Item -NewName $NewName
    $NewTarget = $NewTargetTmp
    $CurrentFolder = Get-Item $CurrentFolder.Parent.FullName
}Until($CurrentFolder.FullName -eq $RootFolder)
$VerbosePreference='SilentlyContinue'

您可以注释掉$VerbosePreference行(共有2行),以减少垃圾邮件。