标题: [文件操作] [已解决]批处理如何给文件夹加前缀(保留原文件夹名) [打印本页]
作者: 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 编辑
先测试目录。- <#*,:&cls
- @echo off
- pushd "%~dp0"
- powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
- popd
- pause
- exit /b
- #>
- # 给指定文件夹及其子文件夹加前缀(保留原文件夹名) 前缀内容为ss001(编码) 200p(文件夹内文件数) 2.1GB(文件夹总大小) +原文件夹名
- # 文件夹Depth从0开始,现在只改名Depth=1
- # ss001 200p 2.1GB 原文件夹名
- # ss002 4500p 3.1GB 原文件夹名
- # ss003 5683p 3.8GB 原文件夹名
-
- # 目录列表
- $rootDirs = "D:\sec", "D:\Videos", "D:\image"
-
- function Format-FileSize {
- # output: string
- param (
- [long]$FileSize
- )
- switch ($FileSize) {
- { $_ -ge 1TB } { return "{0:F2}TB" -f ($_ / 1TB) }
- { $_ -ge 1GB } { return "{0:F2}GB" -f ($_ / 1GB) }
- { $_ -ge 1MB } { return "{0:F2}MB" -f ($_ / 1MB) }
- { $_ -ge 1KB } { return "{0:F2}KB" -f ($_ / 1KB) }
- Default { return "{0}Bytes" -f $_ }
- }
- }
- function Get-DirectoryInfo {
- # output: PSCustomObject
- param (
- [string]$DirPath,
- [string]$Prefix = "",
- [int]$Depth = 0,
- [scriptblock]$DepthEval = { $true }
- )
- $psoSize = New-Object psobject -Property ([ordered]@{
- FilesCount = [long]0
- DirectorySize = [long]0
- })
- $index = 0
- Get-ChildItem -LiteralPath $DirPath -Force | ForEach-Object {
- if ($_.PSIsContainer) {
- $index++
- $psoSize.DirectorySize += (Get-DirectoryInfo -DirPath ($_.FullName) -Prefix "ss$($index.ToString().PadLeft(3,[char]'0'))" `
- -Depth ($Depth + 1) -DepthEval $DepthEval).DirectorySize
- } else {
- $psoSize.DirectorySize += $_.Length
- $psoSize.FilesCount += 1
- }
- }
- $fsoInfo = Get-Item $DirPath -Force
- $origName = $fsoInfo.Name -replace "^ss\d+\s+\d+p\s+\S+\s+", ""
- $fmtSize = Format-FileSize -FileSize ($psoSize.DirectorySize)
- # $fmtSize | Write-Host -ForegroundColor Green
- if ((& $DepthEval $Depth)) {
- Rename-Item -LiteralPath $fsoInfo.FullName `
- -NewName (@($Prefix, "$($psoSize.FilesCount)p", ($fmtSize), $origName) -join " ") `
- -Force -Verbose
- }
- $psoSize
- }
-
- foreach ($item in $rootDirs) {
- Get-DirectoryInfo -DirPath $item -Prefix "ss001" -DepthEval { param($depth)$depth -eq 1 }
- }
复制代码
作者: 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,那么请修改代码复制代码
作者: 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 |