Board logo

标题: [文件操作] [已解决]批处理如何给文件夹加前缀(保留原文件夹名) [打印本页]

作者: xiong8330209    时间: 2021-2-19 16:06     标题: [已解决]批处理如何给文件夹加前缀(保留原文件夹名)

如何给文件夹加前缀(保留原文件夹名) 前缀内容为ss001(编码) 200p(文件夹内文件数) 2.1GB(文件夹总大小) +原文件夹名
并且该BAT需要批量为大量文件夹批量添加该前缀,列举如下:
ss001 200p 2.1GB 原文件夹名
ss002 4500p 3.1GB 原文件夹名
ss003 5683p 3.8GB 原文件夹名
....
作者: flashercs    时间: 2021-2-20 18:04

本帖最后由 flashercs 于 2021-2-27 23:17 编辑

先测试目录。
  1. <#*,:&cls
  2. @echo off
  3. pushd "%~dp0"
  4. powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
  5. popd
  6. pause
  7. exit /b
  8. #>
  9. # 给指定文件夹及其子文件夹加前缀(保留原文件夹名) 前缀内容为ss001(编码) 200p(文件夹内文件数) 2.1GB(文件夹总大小) +原文件夹名
  10. # 文件夹Depth从0开始,现在只改名Depth=1
  11. # ss001 200p 2.1GB 原文件夹名
  12. # ss002 4500p 3.1GB 原文件夹名
  13. # ss003 5683p 3.8GB 原文件夹名
  14. # 目录列表
  15. $rootDirs = "D:\sec", "D:\Videos", "D:\image"
  16. function Format-FileSize {
  17.   # output: string
  18.   param (
  19.     [long]$FileSize
  20.   )
  21.   switch ($FileSize) {
  22.     { $_ -ge 1TB } { return "{0:F2}TB" -f ($_ / 1TB) }
  23.     { $_ -ge 1GB } { return "{0:F2}GB" -f ($_ / 1GB) }
  24.     { $_ -ge 1MB } { return "{0:F2}MB" -f ($_ / 1MB) }
  25.     { $_ -ge 1KB } { return "{0:F2}KB" -f ($_ / 1KB) }
  26.     Default { return "{0}Bytes" -f $_ }
  27.   }
  28. }
  29. function Get-DirectoryInfo {
  30.   # output: PSCustomObject
  31.   param (
  32.     [string]$DirPath,
  33.     [string]$Prefix = "",
  34.     [int]$Depth = 0,
  35.     [scriptblock]$DepthEval = { $true }
  36.   )
  37.   $psoSize = New-Object psobject -Property ([ordered]@{
  38.       FilesCount    = [long]0
  39.       DirectorySize = [long]0
  40.     })
  41.   $index = 0
  42.   Get-ChildItem -LiteralPath $DirPath -Force | ForEach-Object {
  43.     if ($_.PSIsContainer) {
  44.       $index++
  45.       $psoSize.DirectorySize += (Get-DirectoryInfo -DirPath ($_.FullName) -Prefix "ss$($index.ToString().PadLeft(3,[char]'0'))" `
  46.           -Depth ($Depth + 1) -DepthEval $DepthEval).DirectorySize
  47.     } else {
  48.       $psoSize.DirectorySize += $_.Length
  49.       $psoSize.FilesCount += 1
  50.     }
  51.   }
  52.   $fsoInfo = Get-Item $DirPath -Force
  53.   $origName = $fsoInfo.Name -replace "^ss\d+\s+\d+p\s+\S+\s+", ""
  54.   $fmtSize = Format-FileSize -FileSize ($psoSize.DirectorySize)
  55.   # $fmtSize | Write-Host -ForegroundColor Green
  56.   if ((& $DepthEval $Depth)) {
  57.     Rename-Item -LiteralPath $fsoInfo.FullName `
  58.       -NewName (@($Prefix, "$($psoSize.FilesCount)p", ($fmtSize), $origName) -join " ") `
  59.       -Force -Verbose
  60.   }
  61.   $psoSize
  62. }
  63. foreach ($item in $rootDirs) {
  64.   Get-DirectoryInfo -DirPath $item -Prefix "ss001" -DepthEval { param($depth)$depth -eq 1 }
  65. }
复制代码

作者: xiong8330209    时间: 2021-2-22 14:18

回复 2# flashercs
你好 谢谢回复 我试用了代码 P和文件大小可以实现了 但SS001  SS002 SS003这种渐进式标题头部没有实现,只统一显示了ss001,能否帮忙添加相关代码,谢谢
作者: flashercs    时间: 2021-2-22 17:44

本帖最后由 flashercs 于 2021-2-22 20:42 编辑

回复 3# xiong8330209

ss001 ss002的排序是指同目录下的文件夹前缀还是所有文件夹的前缀?
假设要修改目录"D:\A"下的子目录 1,2,3,4,5,那么请修改代码
  1. $rootDirs = "D:\A"
复制代码

作者: xiong8330209    时间: 2021-2-26 16:00

回复 4# flashercs
你好 ss001 ss002 ss003渐进理解解决了,但我发现如果一个文件夹有好几层子文件夹,所有子层级代码全都会加上前缀,我只需要第一层子文件夹加前缀就行了,第二第三及以后的文件夹不需要加前缀,是否可以解决,谢谢!
作者: flashercs    时间: 2021-2-27 23:16

回复 5# xiong8330209


    2楼代码已修改了。
作者: xiong8330209    时间: 2021-2-28 14:48

回复 6# flashercs

谢谢大佬!下段文字写给后来者有类似需求的人 该代码的功能为:通过设定 $rootDirs = "文件路径(只需要填写一个父文件路径即可)" 可以批量(几百上千个都不是问题)给第一层级所有子文件夹添加前缀并自动显示该子文件的 编号(自动渐进)+文件数+文件总大小+保留原文件名,文件越多要整理效率越高!
作者: xiong8330209    时间: 2021-2-28 15:08

回复 6# flashercs

此外 需要修改ss001 ss002 ss003的标头为sy101 sy102 sy103 修改
    $psoSize.DirectorySize += (Get-DirectoryInfo -DirPath ($_.FullName) -Prefix "修改这里为sy$($index.ToString().PadLeft(3,[char]'1'))" `
          -Depth ($Depth + 1) -DepthEval $DepthEval).DirectorySize
$psoSize.FilesCount += 修改这里为100




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2