标题: [文件操作] [已解决] 文件名更改大小写 [打印本页]
作者: Heykuz 时间: 2018-1-5 21:07 标题: [已解决] 文件名更改大小写
多个文件的文件名大小写问题
如图,一个文件夹里面有好多好多个文件,有的文件名是全部大写,有的是全部小写,有的是大小写。
如何能做到把所有文件名,只是头一个字母是大写,其它是小写。感觉这样是整齐最美观的效果。
如:bathome 变为 Bathome
作者: yhcfsr 时间: 2018-1-6 02:52 标题: POWERSHELL
本帖最后由 yhcfsr 于 2018-1-7 23:37 编辑
得到4楼大神的指点,将PS的代码修正如下- $SourDir="D:\temp" #设置源目录
- Get-ChildItem -Path $SourDir -Force -Recurse -File| %{$old=$_.Name.ToLower();
- $new=(''+$old[0]).ToUpper()+$old.Substring(1, $old.Length-1);
- Rename-Item -NewName $new -Path $_.FullName -WhatIf
- }
- pause
复制代码
这时powershell脚本,保存为ps1格式。没有用过PS脚本的自行百度。WIN10以下系统,建议去MS官网升级最新PS
确认屏幕信息显示对文件的修改无误,删除最后一句(非pause)的-whatif 可实现对源文件进行修改。此脚本修改源目录及其子目录下所有文件.
看了7,8楼关于dir /l的使用,我也写了个bat,有些冗长,效率不高,聊以自娱。
原因是循环变量%%a,单独使用%%a或%%~a的确能把路径转换为小写,但如果使用%%~na又会恢复原来文件名的样子。真是坑爹啊。- @echo off
- set "SourDir=d:\temp"
-
- for /f "delims=" %%a in ('dir /a-d /s /b /l "%SourDir%\*.*"') do (
- rem 将文件名转换为小写
- call :name2lower "%%a" file_name
- setlocal enableDelayedExpansion
- rem 获取文件名第一个字符,若为小写则转换为大写
- 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
- rem 重命名
- ren "%%~a" "!head!!file_name:~1!"
- endlocal
- )
- pause
- goto:eof
-
- rem ===将文件名转换为小写===
- :name2lower
- setlocal
- set "name=%~1"
- :lp
- call set "ch=%%name:~%i%,1%%"
- if "%ch%" neq "\" set /a i-=1&goto :lp
- set /a i+=1
- call set "name=%%name:~%i%%%"
- endlocal&set "%2=%name%"&goto:eof
- rem ========================
复制代码
作者: Heykuz 时间: 2018-1-6 08:32
感谢yh,不会用,在论坛搜索了一下,要教程、入门、安装net……唔。感觉bat能搞定的,坐等大神们进来。
作者: pcl_test 时间: 2018-1-6 12:27
回复 2# yhcfsr
$_.Length是文件大小,$filename.Length才对
另外可以加个筛选,仅对文件名首字符为字母的进行处理
还有可以这样截取- $old=$_.Name.ToLower();
- $new=(''+$old[0]).ToUpper()+$old.Substring(1, $old.Length-1);
- #$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
- @echo off&setlocal enabledelayedexpansion
- 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
- 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
- for %%i in (%D%) do set #%%i=%%i
- for /f "delims=" %%i in ('dir/b *.*') do (
- set "var=%%~ni"
- for %%j in (%x%) do set var=!var:%%j=%%j!
- set num=!var:~0,1!
- if defined #!num! (
- for %%k in (!num!) do set num=!#%%k!
- ren "%%i" "!num!!var:~1!%%~xi"
- )
- )
复制代码
作者: pcl_test 时间: 2018-1-6 23:50
回复 6# FOR
dir /L 可以省事一些
作者: FOR 时间: 2018-1-7 00:00
回复 7# pcl_test
谢谢,原来有这个参数,才知道,修改如下- @echo off&setlocal enabledelayedexpansion
- 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
- for %%i in (%D%) do set #%%i=%%i
- for /f "delims=" %%i in ('dir/b/l *.*') do (
- set "var=%%~ni"
- set "num=!var:~0,1!"
- if defined #!num! (
- for %%k in (!num!) do set num=!#%%k!
- ren "%%i" "!num!!var:~1!%%~xi"
- )
- )
复制代码
作者: 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 |