我有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
但是我不知道如何使它从底部到顶部。就我所知,它不起作用,因为它从第一个文件夹转到最后一个文件夹,而在第二个文件夹上,我得到的名称例外,路径太长。有什么想法吗?
答案 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行),以减少垃圾邮件。