如何在文件名中处理em破折号

时间:2014-03-27 03:26:39

标签: windows batch-file

在装有Windows 7的PC上,我使用一个简单的批处理脚本重命名一些Excel文件,预先挂起其父文件夹名称:

for /f "delims=" %%i in ('dir /b /AD') do (
    cd "%%i"
    for /f "delims=" %%j in ('dir /b *.xl*') do ren "%%~j" "%%i_%%~j"
    cd..
)

我注意到有些文件生成错误,“系统无法找到指定的文件。”这些文件在文件名中都有一个短划线( - )。在使用Windows资源管理器将em破折号更改为常规连字符( - )后,该脚本在这些文件上运行良好。

如何帮助编写这些文件的重命名脚本?

1 个答案:

答案 0 :(得分:1)

您的问题不在于批处理变量:从命令行可以正常工作:

for %i in (*) do ren "%~i" "test_%~i"

但是,从以下可以看出:

for /f "delims=" %i in ('dir /b /a-d') do @echo ren "%~i" "test2_%~i"

dir /b正在将em破折号更改为连字符,因此ren命令显然无法找到要更改的文件。

对于您的示例,您应该找到:

for /d %%i in (*) do (

for %%j in (*.xl*) do ...

应该可以正常工作。

如果由于其他原因需要dir /b,我现在就看不到解决方案。

(我有一个错综复杂的尝试,使用"环境变量替换"和#34;延迟环境变量扩展"交换所有连字符的问号,如{{1}中所述}和SET /?,允许任何字符匹配,然后再次使用CMD /?模式匹配来忽略问题。

<子>即

ren

但是SETLOCAL ENABLEDELAYEDEXPANSION for /f "delims=" %%I in ('dir /b /a-d') do ( Set K=%%I ren "!K:-=?!" "test2_!K:-=?!" ) ren * x*替换文件的开头,因此上面用x之前的那个位置的内容替换了连字符插入。

所以这种方法最好的方法是将em破折号转换为连字符:

test_

<子>)

确认问题的输出是SETLOCAL ENABLEDELAYEDEXPANSION for /f "delims=" %%I in ('dir /b /a-d') do ( Set K=%%I ren "!K:-=?!" "test2_!K!" ) :在命令行上:

dir /b

其中dir /b *—* > test.txt 是一个短划线,只会用em破折号列出文件,但是在输出文件中,例如,你只会找到连字符,而不是破折号。

BTW我已经在Windows 8.1上完成了所有这些测试Notepad test.txt显示为VER

(正如我上面提到的,我在这个答案中确实有Microsoft Windows [Version 6.3.9600],但是ren * x*取代第一个字符而不是插入它,我总是以为x做了!)