使用Windows批处理命令批量查找并用连字符替换破折号

时间:2019-02-14 02:22:56

标签: windows batch-file cmd

位于子文件夹中的多个文件具有相似的名称和连续的D.C. _ 18 CA 2616 –00000001.txt。想要找到0000*之前的“破折号”字符并将其替换为连字符。

例如,从D.C. _ 18 CA 2616 –00000001.txtD.C. _ 18 CA 2616 -00000001.txt

已经尝试过...

@echo off
Setlocal enabledelayedexpansion

Set "Pattern=–"
Set "Replace=-"

For /R %%a in (*–*) Do (
set "File=%%~nxa"
Ren "%%a" "!File:%Pattern%=%Replace%!"
)

Pause&Exit

1 个答案:

答案 0 :(得分:0)

这是一个非常棘手的任务,因为破折号字符是Unicode代码点U + 2013。在默认的Windows命令处理器中,它使用437控制台代码页。 û字符是代码页437中的字符号150。因此,似乎一个进程正在代码页1252中写入文件,而另一个进程正在使用代码页437读取文件。-关于问题{{3}的更好解释}

要解决此问题,我们可以在脚本开头使用chcp 1252将437控制台代码页更改为1252。

由于我们正在处理Unicode字符,因此,如果您尝试将û粘贴到基本文本文件编辑器中,它将直接将其更改为 en破折号。为了解决这个问题,我使用了编辑器here,并在编辑器中更改了编码(编码,字符集,西欧,OEM-US),以允许编辑器粘贴û字符。 -有关问题notepad++的更多说明。

ChangeEnDashToDash.bat:

@echo off
setlocal EnableDelayedExpansion
chcp 1252>NUL

Rem | Get Each File Name
for /f "tokens=*" %%A in ('dir "*.txt" /b') do (

    Rem | Get Each File Name
    for /f "tokens=*" %%B in ('Echo %%A^| find /i "û"') do (

        Rem | Save Original Name
        Set "OriginalName=%%B"

        Rem | Get New Name
        SET "ModifiedName=!OriginalName:û=-%!"

        Ren "!OriginalName!" "!ModifiedName!"

    )
)

goto :EOF

下面的代码将简单地通过使用here将任何更改为-。要获取.txt文件,我们可以将fordir "*.txt" /b一起使用循环。然后,使用Echo %%A^| find /i "û"将仅显示带有的文件名。从那里我们可以设置一些字符串并重命名它们。

如果您还希望搜索子目录,请将dir "*.txt" /b更改为dir "*.txt" /b /s。我留下了一些rem语句来帮助解释脚本过程。


要获取有关任何命令的帮助,请执行以下操作:

  • set /?
  • for /?
  • if /?
  • ren /?
  • 等等。