在装有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破折号更改为常规连字符( - )后,该脚本在这些文件上运行良好。
如何帮助编写这些文件的重命名脚本?
答案 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
做了!)