我正在尝试更改当前文件夹中的所有文件名,我试图通过删除文件前缀(每个文件都有一个公共前缀)或将其名称更改为其计数(如果有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
但当然,没有工作,所以我现在寻求帮助和一些解释,如果可能的话(我想了解这些事情是如何工作的)。提前感谢您的帮助。
答案 0 :(得分:29)
我不明白为什么你不能使用批处理文件。但这是一个适用于大多数文件名的解决方案。
严重 - 首先你必须确保你有一个未定义的变量名,我将使用fname
set "fname="
接下来是实际重命名的命令。如果已经定义了fname,它将无法正常工作。
for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%")
为每次迭代定义fname变量,然后语法%fname:*prefix=%
替换第一次出现的“prefix”。棘手的是Windows首次尝试在首次解析命令时扩展%fname%。当然,这不起作用,因为它尚未定义。在命令行中,如果找不到变量,则保留百分比。 CALL会导致在设置变量后发生额外的扩展阶段,因此扩展可以正常工作。
如果在运行命令之前定义了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 %%最初不会展开,而是将双倍百分比转换为单个百分比,然后在CALL之后展开%fname%。如果已经使用批处理文件定义了fname,则无关紧要。 SETLOCAL将fname的临时(本地)定义为批处理文件。
答案 1 :(得分:28)
提供了一个更简单的解决方案 https://superuser.com/a/871799/497147
我将其复制到此处以便于访问。
忘记复杂的脚本。
rename
是一个非常古老且从未正确完成的命令。如果你没有正确使用它,结果可能会让你感到惊讶。例如,要从
即可abcd
,abcd1.txt
,abcd2.txt
等删除前缀abcd3.txt
,以获取1.txt
,2.txt
,3.txt
只需使用rename "abcd*.txt" "////*.txt"
您需要与要删除的初始字符数相同的
/
个数。请为两个参数设置双引号。
答案 2 :(得分:0)
以下是为所有文件用rename
修剪前缀的直接方法
rename -d your_prefix *