Board logo

标题: [文件操作] [已解决] 文件名更改大小写 [打印本页]

作者: Heykuz    时间: 2018-1-5 21:07     标题: [已解决] 文件名更改大小写

多个文件的文件名大小写问题

如图,一个文件夹里面有好多好多个文件,有的文件名是全部大写,有的是全部小写,有的是大小写。
如何能做到把所有文件名,只是头一个字母是大写,其它是小写。感觉这样是整齐最美观的效果。
如:bathome 变为 Bathome
作者: yhcfsr    时间: 2018-1-6 02:52     标题: POWERSHELL

本帖最后由 yhcfsr 于 2018-1-7 23:37 编辑

得到4楼大神的指点,将PS的代码修正如下
  1. $SourDir="D:\temp" #设置源目录
  2. Get-ChildItem -Path $SourDir -Force -Recurse -File| %{$old=$_.Name.ToLower();
  3.     $new=(''+$old[0]).ToUpper()+$old.Substring(1, $old.Length-1);
  4.    Rename-Item -NewName $new -Path $_.FullName -WhatIf
  5. }
  6. pause
复制代码
这时powershell脚本,保存为ps1格式。没有用过PS脚本的自行百度。WIN10以下系统,建议去MS官网升级最新PS
确认屏幕信息显示对文件的修改无误,删除最后一句(非pause)的-whatif 可实现对源文件进行修改。此脚本修改源目录及其子目录下所有文件.

看了7,8楼关于dir /l的使用,我也写了个bat,有些冗长,效率不高,聊以自娱。
原因是循环变量%%a,单独使用%%a或%%~a的确能把路径转换为小写,但如果使用%%~na又会恢复原来文件名的样子。真是坑爹啊。
  1. @echo off
  2. set "SourDir=d:\temp"
  3. for /f "delims=" %%a in ('dir /a-d /s /b /l "%SourDir%\*.*"') do (
  4. rem 将文件名转换为小写
  5. call :name2lower "%%a" file_name
  6. setlocal enableDelayedExpansion
  7. rem 获取文件名第一个字符,若为小写则转换为大写
  8. set "head=!file_name:~0,1!"&(echo !head!|findstr /i "[a-z]"&&for %%s in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set "head=!head:%%s=%%s!")>nul
  9. rem 重命名
  10. ren "%%~a" "!head!!file_name:~1!"
  11. endlocal
  12. )
  13. pause
  14. goto:eof
  15. rem ===将文件名转换为小写===
  16. :name2lower
  17. setlocal
  18. set "name=%~1"
  19. :lp
  20. call set "ch=%%name:~%i%,1%%"
  21. if "%ch%" neq "\" set /a i-=1&goto :lp
  22. set /a i+=1
  23. call set "name=%%name:~%i%%%"
  24. endlocal&set "%2=%name%"&goto:eof
  25. rem ========================
复制代码

作者: Heykuz    时间: 2018-1-6 08:32

感谢yh,不会用,在论坛搜索了一下,要教程、入门、安装net……唔。感觉bat能搞定的,坐等大神们进来。
作者: pcl_test    时间: 2018-1-6 12:27

回复 2# yhcfsr

$_.Length是文件大小,$filename.Length才对
另外可以加个筛选,仅对文件名首字符为字母的进行处理
还有可以这样截取
  1. $old=$_.Name.ToLower();
  2. $new=(''+$old[0]).ToUpper()+$old.Substring(1, $old.Length-1);
  3. #$new=[Regex]::replace($old,'^.',{param($m);$m.Value.ToUpper()});
复制代码

作者: yhcfsr    时间: 2018-1-6 13:40

回复 4# pcl_test
加个空格就可以把char转成string了,就可以用toupper了,我怎么没想到,感谢老大指点
作者: FOR    时间: 2018-1-6 23:30

  1. @echo off&setlocal enabledelayedexpansion
  2. set D=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  3. set x=a b c d e f g h i j k l m n o p q r s t u v w x y z
  4. for %%i in (%D%) do set #%%i=%%i
  5. for /f "delims=" %%i in ('dir/b *.*') do (
  6. set "var=%%~ni"
  7. for %%j in (%x%) do set var=!var:%%j=%%j!
  8. set num=!var:~0,1!
  9. if defined #!num! (
  10. for %%k in (!num!) do set num=!#%%k!
  11. ren "%%i" "!num!!var:~1!%%~xi"
  12. )
  13. )
复制代码

作者: pcl_test    时间: 2018-1-6 23:50

回复 6# FOR

dir /L 可以省事一些
作者: FOR    时间: 2018-1-7 00:00

回复 7# pcl_test

谢谢,原来有这个参数,才知道,修改如下
  1. @echo off&setlocal enabledelayedexpansion
  2. set D=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  3. for %%i in (%D%) do set #%%i=%%i
  4. for /f "delims=" %%i in ('dir/b/l *.*') do (
  5. set "var=%%~ni"
  6. set "num=!var:~0,1!"
  7. if defined #!num! (
  8. for %%k in (!num!) do set num=!#%%k!
  9. ren "%%i" "!num!!var:~1!%%~xi"
  10. )
  11. )
复制代码

作者: Heykuz    时间: 2018-1-7 22:20

本帖最后由 Heykuz 于 2018-1-7 22:28 编辑
回复  pcl_test

谢谢,原来有这个参数,才知道,修改如下
FOR 发表于 2018-1-7 00:00


测试完毕,完全正确,感谢for,也感谢其它大大们和二楼。
要刷新一下文件夹才见效果的哦。好象是for的6楼更见效果。
真心的超有用,刷新一下之后,整齐企理蛮好看。




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