windows - 如何处理文件名中的破折号

标签 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 资源管理器将破折号更改为常规连字符 (-) 后,该脚本在这些文件上运行良好。

我如何帮助脚本重命名这些文件?

最佳答案

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

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/

相关文章:

windows - Azure WebApp 实例中的安全性

java - 临时文件、单实例锁和进程终止 (Java)

windows - 如何在 Windows 10 计算机上执行 "install"sqlite3?

windows - 如何编写将一个目录复制到另一个目录并替换旧文件的批处理脚本?

windows - 如何使用 AutoIt 单击不同语言的窗口对话框

c++ - WM_QUIT 只发布线程而不是窗口?

batch-file - ffmpeg 转换 - 保持音频比特率

batch-file - ffmpeg 批处理在名称中保留旧文件类型

python - 通过批处理脚本安装带有路径变量的python

windows - (这时候出乎意料