将多个文件的前缀重命名或删除为每个文件';Windows中的数字

将多个文件的前缀重命名或删除为每个文件';Windows中的数字,windows,cmd,rename,Windows,Cmd,Rename,我正在尝试更改当前文件夹中的所有文件名,我正在尝试通过删除文件前缀(每个文件都有一个公共前缀)或将其名称更改为其计数(如果有5个文件,则文件名将为1.txt 2.txt 3.txt 4.txt 5.txt)来实现这一点 现在我已经在cmd中找到了ren命令,并对其进行了一些操作,但到目前为止,我还无法获得结果,我只能在cmd中运行该命令,因此无法使用批处理文件 这是我得到的最接近的,但它只添加了一个前缀: FOR %f IN (*.*) DO ren %f prefix%f 我试着做相反的事情

我正在尝试更改当前文件夹中的所有文件名,我正在尝试通过删除文件前缀(每个文件都有一个公共前缀)或将其名称更改为其计数(如果有5个文件,则文件名将为1.txt 2.txt 3.txt 4.txt 5.txt)来实现这一点

现在我已经在cmd中找到了ren命令,并对其进行了一些操作,但到目前为止,我还无法获得结果,我只能在cmd中运行该命令,因此无法使用批处理文件

这是我得到的最接近的,但它只添加了一个前缀:

FOR %f IN (*.*) DO ren %f prefix%f
我试着做相反的事情:

FOR %f IN (*.*) DO ren prefix%f %f

但是,当然,没有工作,所以我现在请求帮助和一些解释,如果可能的话(我想了解这些事情是如何工作的)。提前感谢您的帮助。

我不明白您为什么不能使用批处理文件。但这里有一个解决方案,应该适用于大多数文件名

关键-首先必须确保有一个未定义的变量名,我将使用fname

set "fname="
接下来是实际执行重命名的命令。如果已经定义了fname,它将无法正常工作

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%")
fname变量是为每次迭代定义的,然后语法
%fname:*prefix=%
将第一次出现的“prefix”替换为零。棘手的是,在第一次解析命令时,Windows首次尝试展开%fname%。当然,这是行不通的,因为它还没有被定义。如果未找到变量,则在命令行上保留百分比。该调用会导致在设置变量后发生额外的扩展阶段,因此扩展工作正常

如果fname是在运行命令之前定义的,那么它只会尝试为每个迭代重命名相同的文件,而不是在循环中指定的值

如果要使用其他前缀再次运行该命令,则必须首先再次清除该定义

编辑-这是一个名为“RemovePrefix.bat”的批处理文件,用于执行此任务

::RemovePrefix.bat  prefix  fileMask
@echo off
setlocal
for %%A in ("%~1%~2") do (
  set "fname=%%~A"
  call ren "%%fname%%" "%%fname:*%~1=%%"
)
假设您的文件名为
“prefixName.txt”
,那么您可以通过执行

RemovePrefix  "prefix"  "*.txt"
批处理文件将重命名当前目录中的文件。批处理文件也必须位于当前目录中,除非批处理文件位于PATH变量中的目录中。或者,可以在调用批处理文件时指定该文件的完整路径


批处理文件中的扩展规则不同。FOR变量必须引用为%%A而不是%A,并且%%fname%%最初不会展开,而是将双百分比转换为单百分比,然后在调用后展开%fname%。fname是否已经用批处理文件定义了并不重要。SETLOCAL使fname的定义临时(本地)到批处理文件。

中提供了一个更简单的解决方案

我把它复制到这里是为了方便访问

忘记复杂的脚本吧

rename
是一个非常古老且从未正确完成的命令。如果使用不当,结果可能会让你大吃一惊

例如,要从
abcd1.txt
abcd2.txt
abcd3.txt
等中删除前缀
abcd1.txt
2.txt
3.txt
只需使用

rename "abcd*.txt" "////*.txt"
您需要与要删除的初始字符数相同的
/

两个参数都要加双引号


以下是使用
rename
为所有文件修剪前缀的直接方法

rename -d your_prefix *

太好了,非常感谢您的额外解释!编辑:作为一个额外的请求,您是否可以在批处理文件中发布一个示例?我不知道它是如何完美的-有一个讨厌的错误,其中%f与%fname%中的%f混淆了。现在全部修复:)我必须在此脚本中进行哪些修改,以便它搜索
“.txt”
在当前目录的每个子目录中,并删除给定的
前缀
?我相信您只需将/R选项添加到FOR statement批处理文件中即可。这些命令似乎对非常大的目录都不起作用。它不断地为已经添加前缀的文件添加前缀。今天的救世主。非常酷和奇怪的技术。我已经用这些信息更新了我的超级用户Q&A,尽管从技术上讲,
/
并没有起到通配符的作用。难以置信的简单和完美。注意“/”的数量与匹配表达式中指定的字符数无关。另一个例子:
rename“IM***”///****”
匹配一个2字符的前缀,并删除其中的4个字符,这不起作用。