我正在尝试用批处理重命名文件。我想用Ö ö Ç ç Ş ş İ ı Ğ ğ Ü ü代替字母O o C c S s I i G g U u,但它失败了。我能做些什么来解决这个问题。
@echo OFF
set TargetFolder=%~dp0target
setlocal enableDelayedExpansion
set srch=Ö ö Ç ç Ş ş İ ı Ğ ğ Ü ü
set rplc=O o C c S s I i G g U u
set /a n=0
for %%a in (!srch!) do set /a n+=1&set srch[!n!]=%%a
set /a n=0
for %%a in (!rplc!) do set /a n+=1&set rplc[!n!]=%%a
for /f "tokens=* delims=" %%a in ('dir /b /a-d "%TargetFolder%\*"') do (
set NewFileName=%%~na
for /l %%x in (1,1,!n!) do (
for /f "tokens=* delims=" %%t in ('jrepl !srch[%%x]! !rplc[%%x]! /s NewFileName') do set "NewFileName=%%t"
)
ren "%TargetFolder%\%%~nxa" "!NewFileName!%%~xa"
)
endlocal
pausePS:这段代码需要来自@dbenham的JREPL.BAT文件。
发布于 2015-01-28 23:15:55
问题字符是没有ASCII等效值的Unicode。文件系统允许这样的unicode字符,但是命令行对unicode的支持有限。
可以使用\uNNNN转义序列使用JREPL操作unicode字符。但是,即使您正确地执行了该操作,当您尝试重命名文件时,命令行也会破坏该值。
我编写了另一个名为JREN.BAT的混合JScript/批处理实用程序,它通过正则表达式替换重命名文件或文件夹。我没有计划这一点,但这是一个完美的JREN.BAT应用程序,这是因为JScript实际上是重命名的,而JScript本机使用unicode。
为了进行重命名,必须首先为问题字符建立unicode代码值。我将字符复制到一个MicroSoft Word文档中,并使用id=nrsi&id=UTTUsingUnicodeMacros描述的过程来计算代码值。
我使用JREN编写了三个解决方案。
1)这个第一个版本非常容易遵循,而且易于维护--只需添加一个额外的
为每个需要翻译的“查找替换”行。最大的缺点是性能慢,因为它会反复重命名每个文件--每一个字符都要翻译一次。
@echo off
for %%A in (
"00D6 O"
"00F6 o"
"00C7 C"
"00E7 c"
"015E S"
"015F s"
"0130 I"
"0131 i"
"011E G"
"011F g"
"00DC U"
"00FC u"
) do for /f "tokens=1,2" %%B in (%%A) do call jren "\u%%B" "%%C" %*2)第二个版本有点邪恶,很难维护。但是它要快得多,因为它在一次传递中完全重命名了每个文件。
@echo off
call jren "(\u00D6)|(\u00F6)|(\u00C7)|(\u00E7)|(\u015E)|(\u015F)|(\u0130)|(\u0131)|(\u011E)|(\u011F)|(\u00DC)|(\u00FC)" ^
"$1?'O':$2?'o':$3?'C':$4?'c':$5?'S':$6?'s':$7?'I':$8?'i':$9?'G':$10?'g':$11?'U':'u'" /j %*3)最后一个版本给出了这两个世界的最佳结果。翻译列表很容易维护,就像第一个版本一样,但是它会动态地构建第二个方法使用的搜索和替换表达式。因此,它能够在一次传递中重命名所有文件。
@echo off
setlocal enableDelayedExpansion
set "find="
set "repl="
set /a n=0
for %%A in (
"00D6 O"
"00F6 o"
"00C7 C"
"00E7 c"
"015E S"
"015F s"
"0130 I"
"0131 i"
"011E G"
"011F g"
"00DC U"
"00FC u"
) do for /f "tokens=1,2" %%B in (%%A) do (
set /a n+=1
set "find=!find!|(\u%%B)"
set "repl=!repl!$!N!?'%%C':"
)
call jren "!find:~1!" "!repl!$0" /j %*假设您将上述任何脚本命名为"fixUnicode.bat“,并将其与JREN.BAT一起放置在您的路径中的某个位置,那么您可以使用以下任何一种方法:
重命名当前目录中的所有文件
fixUnicode重命名d:\test文件夹中的所有文件
fixUnicode /p "d:\test"递归重命名c:驱动器上的所有文件和文件夹
fixUnicode /s /p "c:\"
fixUnicode /d /s /p "c:\"还可以附加其他选项来指定要包含或排除哪些文件和/或路径。使用jren /?获取对JREN可用的所有选项的帮助。其中大部分都可以与fixUnicode.bat一起使用。
发布于 2015-01-27 19:54:46
更改为更正代码页。提示:
CHCP命令将回答.一般情况下:OEM (=852DOS:东欧在我的视窗上)。ANSI ( =1250 Windows:东欧在我的Windows上)下一个脚本cpansi.bat保存为ANSI
echo OFF
setlocal enableDelayedExpansion
set "srch=Ö ö Ç ç Ş ş İ ı Ğ ğ Ü ü"
set "rplc=O o C c S s I i G g U u"
echo srch %srch%
echo rplc %rplc%
endlocal
goto :eof输出:
Active code page: 852
d:\bat>cpansi
d:\bat>echo OFF
srch Í ÷ ă š ¬ ║ I i G g ▄ Ř
rplc O o C c S s I i G g U u
d:\bat>chcp 1250
Active code page: 1250
d:\bat>cpansi
d:\bat>echo OFF
srch Ö ö Ç ç Ş ş I i G g Ü ü
rplc O o C c S s I i G g U u编辑:将ren更改为echo,并为调试目的临时添加dir,以查看发生了什么:
echo ren "%TargetFolder%\%%~nxa" "!NewFileName!%%~xa"
dir /B "%TargetFolder%\%%~nxa"https://stackoverflow.com/questions/28177634
复制相似问题