首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重命名文件,该文件包含ŞşİıĞğü

重命名文件,该文件包含ŞşİıĞğü
EN

Stack Overflow用户
提问于 2015-01-27 18:38:37
回答 2查看 769关注 0票数 1

我正在尝试用批处理重命名文件。我想用Ö ö Ç ç Ş ş İ ı Ğ ğ Ü ü代替字母O o C c S s I i G g U u,但它失败了。我能做些什么来解决这个问题。

代码语言:javascript
运行
复制
@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
pause

PS:这段代码需要来自@dbenham的JREPL.BAT文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)这个第一个版本非常容易遵循,而且易于维护--只需添加一个额外的

为每个需要翻译的“查找替换”行。最大的缺点是性能慢,因为它会反复重命名每个文件--每一个字符都要翻译一次。

代码语言:javascript
运行
复制
@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)第二个版本有点邪恶,很难维护。但是它要快得多,因为它在一次传递中完全重命名了每个文件。

代码语言:javascript
运行
复制
@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)最后一个版本给出了这两个世界的最佳结果。翻译列表很容易维护,就像第一个版本一样,但是它会动态地构建第二个方法使用的搜索和替换表达式。因此,它能够在一次传递中重命名所有文件。

代码语言:javascript
运行
复制
@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一起放置在您的路径中的某个位置,那么您可以使用以下任何一种方法:

重命名当前目录中的所有文件

代码语言:javascript
运行
复制
fixUnicode

重命名d:\test文件夹中的所有文件

代码语言:javascript
运行
复制
fixUnicode /p "d:\test"

递归重命名c:驱动器上的所有文件和文件夹

代码语言:javascript
运行
复制
fixUnicode /s /p "c:\"
fixUnicode /d /s /p "c:\"

还可以附加其他选项来指定要包含或排除哪些文件和/或路径。使用jren /?获取对JREN可用的所有选项的帮助。其中大部分都可以与fixUnicode.bat一起使用。

票数 1
EN

Stack Overflow用户

发布于 2015-01-27 19:54:46

更改为更正代码页。提示:

  • 命令行解释器默认为哪个代码页?CHCP命令将回答.一般情况下:OEM (=852DOS:东欧在我的视窗上)。
  • 将脚本保存为哪个代码页?一般情况下:ANSI ( =1250 Windows:东欧在我的Windows上)

下一个脚本cpansi.bat保存为ANSI

代码语言:javascript
运行
复制
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

输出:

代码语言:javascript
运行
复制
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,以查看发生了什么:

代码语言:javascript
运行
复制
echo ren "%TargetFolder%\%%~nxa" "!NewFileName!%%~xa"
dir /B "%TargetFolder%\%%~nxa"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28177634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档