我有一个包含 120 个.cs
文件的文件夹。
我需要做的是在每个文件名称的扩展名前添加“DO”。
以下是我想到的内容:
ren *.cs *. //this removes all file extensions
ren *.* *DO.cs // this should rename all the files and add the suffixes
现在,这种方法基本可行。但对某些文件则不然。
最初,我以为只是以Do
但...嗯,结果如下:
(其余未在屏幕上显示的内容均可)
现在这不是一个严重的问题;我只是想了解为什么会这样......
通过查看此输出,我认为也许它找不到文件,因为第二个命令包含。进行重命名;但由于重命名时文件夹中的任何文件都没有文件扩展名;所以不可能是这样..
谢谢
答案1
正如其他人所说,它在于ren
解释通配符的方式,这就是为什么它无法*.*
在第二个命令中找到包含点的文件,因为:
- 您不仅使用第一个命令删除了文件扩展名,而且还删除了扩展名前的点:
Artikelnummer.cs > Artikelnummer
- 您的第二条命令是查找包含以下内容的文件名
.
(但没有!):
ren *.*
- 还考虑
ren
使用*
来引用文件名,因此当您查找*.*
(任何名称,任何扩展名)时,您会*
同时使用来引用文件名和扩展名,这会给ren
命令带来混淆!
因此,结论是,唯一的问题是*.*
,将其替换为*
:
ren *.cs *.DO.cs
ren * *DO.cs
但是,如果您想通过运行一行代码来重命名:
从命令提示符运行:
for /f "tokens=* delims=" %a in ('dir /b "%FilesLocation%"') do if %~xa EQU .cs ren "%a" "%~naDO.cs"
或者保存并运行此脚本:
@echo off
for /f "tokens=* delims=" %%a in ('dir /b "%FilesLocation%"') do if %%~xa EQU .cs ren "%%a" "%%~naDO.cs"
并且不要忘记改变%FilesLocation%
它的真实价值。
答案2
答案3
你需要的是 for 命令。我脑海中浮现的命令是这样的:
for /f "tokens=1,2* delims=." %a in ('dir *.cs /b') do (ren %a.%b %aDO.%b)
但是,这对于包含多个点的文件名不起作用。
答案4
FOR
有一种模式可以循环遍历文件(也可以递归),不需要dir /b
(https://ss64.com/nt/for2.html)。您需要传递一个文件 glob 或一个列表(*.cs, \path\*.txt,...)
命令行
FOR %_ IN (*.cs) DO @REN "%_" "%~n_DO.*"
在批处理文件中(使用%%
)
FOR %%_ IN (*.cs) DO @REN "%%_" "%%~n_DO.*"
笔记:
%_
是有效变量@
不转储每个文件名的重命名命令%~n_
仅返回名称部分%_
(删除最后一个扩展名)添加
/R "c:\directory"
以递归解析目录(https://ss64.com/nt/for_r.html)请谨慎使用 - 无法撤消双引号
"
很重要,因为路径和文件名可能包含空格无法按预期与多个扩展配合使用,因为在 Windows 中只有最后一个标记才被视为扩展。即测试版会变成测试版
我建议你先尝试FOR %_ IN (*.cs) DO echo REN "%_" "%~n_DO.*"
一下