[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决] 文件名更改大小写

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

如图,一个文件夹里面有好多好多个文件,有的文件名是全部大写,有的是全部小写,有的是大小写。
如何能做到把所有文件名,只是头一个字母是大写,其它是小写。感觉这样是整齐最美观的效果。
如:bathome 变为 Bathome

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 ========================
复制代码

TOP

感谢yh,不会用,在论坛搜索了一下,要教程、入门、安装net……唔。感觉bat能搞定的,坐等大神们进来。

TOP

回复 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()});
复制代码

TOP

回复 4# pcl_test
加个空格就可以把char转成string了,就可以用toupper了,我怎么没想到,感谢老大指点

TOP

  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. )
复制代码

TOP

回复 6# FOR

dir /L 可以省事一些

TOP

回复 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. )
复制代码

TOP

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

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


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

TOP

返回列表