在 Windows CMD 中递归添加文件扩展名而不重命名子目录

在 Windows CMD 中递归添加文件扩展名而不重命名子目录

我有一个目录,里面有几个没有文件扩展名的文件。这个目录还有几个子目录,里面有同样的东西。

我正在使用forfiles命令添加文件扩展名。但是,当我具体使用此命令时:

forfiles /s /c "cmd /c rename @file @fname.ext"

它将扩展名添加到文件旁边的文件夹中。

有没有办法排除子目录本身,只向其中的文件添加扩展名?

答案1

电源外壳,使用-File参数Get-ChildItem仅检索文件。将输出通过管道传输到Where-Object过滤没有扩展名的文件:

Get-CHildItem -File -Recurse | Where Extension -like ''

管道至Rename-Item,使用 ScriptBlock 构造新名称:

Get-CHildItem -File -Recurse | Where Extension -like '' |
   Rename-Item -NewName { $_.Name + '.ext' }

Key-Banger 版本:

gci -af -recurse | ? Extension -like '' | ren -NewName { $_.Name + '.ext' }

答案2

在此处输入图片描述


这可以更快/更简单地完成,使用for建议的简单方法ss64.com

  • 在命令行中:
@for /r %i in (*)do @if "" == "%~xi" @ren "%~dpni" "%~ni.log"
@echo off
for /r %%i in (*)do if "" == "%%~xi" ren "%%~dpni" "%%~ni.log"
  1. 在目录树中递归循环,仅从以下位置获取文件:
for /r %%i in (*)do
  1. 如果文件不包含("")扩展名(%%~xi),则使用以下语法重命名它,提供源的完整路径( )和仅添加所需扩展名的目标"%%~dpni"名称( ):"%%~ni"
if "" == "%%~xi" ren "%%~dpni" "%~ni.log"

当使用时forfiles,对于任务中排队的每个文件,都会调用、执行并完成 cmd,这会导致其处理过程中性能/时间的损失。

考虑阅读forfiles下面链接的限制/错误:


gci -File -Re | ? {!($_.Extension)}
  • 此命令返回过滤/递归列表,仅返回符合以下条件的文件:True逻辑条件,您的文件中不存在扩展名。
Get-ChildItem -File -Recurse | where-object {!($_.Extension)} | Rename-Item -New {$_.basename+'.log'} -Whatif 
  • 或者使用别名:
gci -File -Re | ? {!($_.Extension)} | ren -New {$_.basename+'.log'} -Whatif
  • 您可以测试,如果结果对您来说似乎不错,只需删除-Whatif等待执行……
gci -File -Re | ? {!($_.Extension)} | ren -New {$_.basename+'.log'} -Whatif


相关内容