在装有 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 资源管理器将破折号更改为常规连字符 (-) 后,该脚本在这些文件上运行良好。
我如何帮助脚本重命名这些文件?
最佳答案
您的问题不在于批处理变量:从命令行可以正常工作:
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
,我现在看不到解决方案。
(我有一个令人费解的尝试将所有连字符换成问号,使用 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
替换文件的开头,所以上面的连字符替换为内容在插入 test_
之前的那个位置。
所以这种方法能做的最好的事情就是将 em 破折号转换为连字符:
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
—
是一个破折号,只会列出带有破折号的文件,但是在输出文件中,例如Notepad test.txt
,您只会找到连字符,没有长破折号。
顺便说一句,我已经在 Windows 8.1 上完成了所有这些测试,VER
显示为 Microsoft Windows [Version 6.3.9600]
。
(正如我上面提到的,我在这个答案中确实有 ren * x*
,但是 replaces 第一个字符为 x
而不是插入它,我一直认为 ren
会这样做!)
关于windows - 如何处理文件名中的破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22677677/