[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程批处理在线视频分享
返回列表 发帖

[文件操作] 求BAT或VBS判断文件名超过一定长度只保存局部主文件名前面的指定字符

本帖最后由 happyaya 于 2019-1-10 10:14 编辑

求批处理或者VBS:在一个指定目录及该目录下的所有子目录,(例如目录下有不同格式文件:无规则命名、没规律位数的文件名、超长文件名、不同格式的文件或者可指定只修改那几种格式的扩展名文件)。判断文件主文件名长度当主文件名字符位数不超过40位字符时,不对该文件名做任何操作,如主文件名超过40个字符位数,则重命名并只保存主文件名前面40位字符数长度的主文件名,扩展名不变;但当如果有多个主文件名前40位字符完全相同的文件则需要相应的40位字符后附加一下001、002……规则,防止重名不能保存。

因为本身没什么基础,自己翻阅了好多资料硬是鼓捣不出来,请教一下众大神看能否实现?先拜谢了,各位前辈请赐教。

本帖最后由 ivor 于 2019-1-10 14:14 编辑

  1. Function GenerateNewName{
  2.     Param( [System.IO.FileInfo]$FilePath )
  3.     $int = 0
  4.     while(test-Path $FilePath.FullName){
  5.         $int ++
  6.         $FilePath = "{0}\{1}{2:D3}{3}" -f ($FilePath.DirectoryName,(([char[]]$FilePath.BaseName)[0..39] -join ""),$int,$FilePath.Extension)
  7.     }
  8.     Return $FilePath.FullName
  9. }
  10. dir C:\ceshi -File -Recurse | %{if (($_.BaseName).Length -gt 40){Move-Item $_.FullName (GenerateNewName($_)) -Verbose}}
复制代码
1

评分人数

TOP

本帖最后由 happyaya 于 2019-1-10 15:11 编辑
ivor 发表于 2019-1-10 11:54



    您好,该代码测试了一下貌似都无法执行呀,求赐教。是不是我系统是Winodws7只支持Powershell 2.0的原因。

TOP

本帖最后由 ivor 于 2019-1-10 15:37 编辑

  1. Function GenerateNewName{
  2.     Param( [System.IO.FileInfo]$FilePath )
  3.     $int = 0
  4.     while(test-Path $FilePath.FullName){
  5.         $int ++
  6.         $FilePath = "{0}\{1}{2:D3}{3}" -f ($FilePath.DirectoryName,(([char[]]$FilePath.BaseName)[0..39] -join ""),$int,$FilePath.Extension)
  7.     }
  8.     Return $FilePath.FullName
  9. }
  10. dir C:\ceshi -Recurse | %{if ($_ -is [System.IO.FileInfo] -and ($_.BaseName).Length -gt 40){Move-Item $_.FullName (GenerateNewName($_)) -Verbose}}
复制代码
1

评分人数

TOP

回复 4# ivor


    安装更新了powershell 3.0问题解决,谢谢。

TOP

回复 1# happyaya


    您好,麻烦再咨询一下,还存着一种情况,条件规则就是当有两个文件,主文件名完全相同,只是不同文件格式,比如XXX.jpg、XXX.txt。但这两个文件就算文件名超长改名加数字规则后还是必须得要保证主文件名完全相同,因为是配套注释文件。这又能否可以实现?

TOP

回复 2# ivor


        您好,麻烦再咨询一下,还存着一种情况,条件规则就是当有两个文件,主文件名完全相同,只是不同文件格式,比如XXX.jpg、XXX.txt。但这两个文件就算文件名超长改名加数字规则后还是必须得要保证主文件名完全相同,因为是配套注释文件。这又能否可以实现?

TOP

  1. Function GenerateNewName{
  2.     Param( [System.IO.FileInfo]$FilePath )
  3.     $int = 0
  4.     if($pool.ContainsKey($FilePath.BaseName)){
  5.         $FilePath = "{0}\{1}{2}" -f ($FilePath.DirectoryName,$pool[$FilePath.BaseName],$FilePath.Extension)
  6.     }
  7.     while(test-Path $FilePath.FullName){
  8.         $int ++
  9.         $FilePath = "{0}\{1}{2:D3}{3}" -f ($FilePath.DirectoryName,(([char[]]$FilePath.BaseName)[0..39] -join ""),$int,$FilePath.Extension)
  10.     }
  11.     $pool[$FilePath.BaseName]=$FilePath.BaseName
  12.    
  13.     Return $FilePath.FullName
  14. }
  15. $pool = @{}
  16. dir C:\ceshi -Recurse | %{if ($_ -is [System.IO.FileInfo] -and ($_.BaseName).Length -gt 40){
  17. Move-Item $_.FullName (GenerateNewName($_)) -Verbose
  18. }}
复制代码
1

评分人数

    • happyaya: 感谢给帖子标题标注[已解决]字样技术 + 1

TOP

返回列表