Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件重命名文件夹中的文件_Batch File_Batch Rename - Fatal编程技术网

Batch file 批处理文件重命名文件夹中的文件

Batch file 批处理文件重命名文件夹中的文件,batch-file,batch-rename,Batch File,Batch Rename,我在一个文件夹中有多个文本文件,我正在搜索内容并重命名找到的文件,但有问题。当我运行批处理时,它将所有找到的文件重命名为相同的文件名。因此,如果它找到3个包含字符串的文件,它会将所有文件重命名为同一个文件。还是有点新鲜。我试图在所有文本文件中找到字符串“test1”,然后将找到的文件重命名为test1.txt、test1(2.txt)等 @ECHO OFF @SETLOCAL enableextensions disabledelayedexpansion SET "sourcedir=C:\

我在一个文件夹中有多个文本文件,我正在搜索内容并重命名找到的文件,但有问题。当我运行批处理时,它将所有找到的文件重命名为相同的文件名。因此,如果它找到3个包含字符串的文件,它会将所有文件重命名为同一个文件。还是有点新鲜。我试图在所有文本文件中找到字符串“test1”,然后将找到的文件重命名为test1.txt、test1(2.txt)等

@ECHO OFF
@SETLOCAL enableextensions disabledelayedexpansion

SET "sourcedir=C:\test"
SET "searchfor=test1"
FOR /f "delims=" %%a IN ('findstr /m /L /c:"%searchfor%" "%sourcedir%\*.txt"') DO (
 REN "%%a" "%searchfor%.txt"
)
改变

 REN "%%a" "%searchfor%.txt"

对于每个要更改的文件名,它将首先检测%searchfor%.txt是否存在,如果不存在,则重命名目标文件。如果存在%searchfor%.txt,则将
重命名
标志设置为nothing,并将
%%r
=1到100的循环设置为1步。如果文件名
%searchfor%(%r).txt不存在,则进行重命名并将
重命名的
设置为(好的-除了nothing之外的任何值都可以-
%r
很方便)。由于现在定义了
重命名
如果未定义
将为false,因此不会对该目标文件名进行进一步的重命名尝试

(未经测试)

注意-语法很重要。不要试图在许多行上打断语句或改变括号的位置。只需剪切粘贴即可

提示:

不要使用
ren
而使用
echo ren
,它只会报告建议的重命名。显然,由于文件实际上不会被重命名,因此过程将报告相同的新名称。然后手动创建
%searchfor%.txt
,然后重试。然后手动创建
%searchfor%(1).txt
,然后重试。您将看到提议的新名称更改。以这种方式进行测试后,将每个
echo-ren
更改为
ren
,所有操作都应顺利进行


(用少量的“点击”对副本进行测试以避免混淆)

REN
命名之前,您必须添加一个计数器,可能使用
SET/a
,然后使用
IF\ELSE
表达式和
EXIST
。这不是对您的问题的回答,但您应该使用
('findstr/m/L/c:“\”“%sourcedir%\*.txt””)
避免包含test1的单词,而不仅仅是test1@UlugToprak,当规定
/L
时,正则表达式
\
应被视为文字字符,且与预期字符串不匹配。hi,在循环中,每个echo测试报告都可能仅正常结束,但如果从ren中裁剪出echo,则当命令文件*.txt将添加到队列中,这将增加,循环将在所有“旧”和“新”中执行“txt文件,没有结尾吗?抱歉,我的英语水平有限,希望您能理解此评论。@kaputtz首先,
findstr
将从当前目录创建所需文件名的列表。/f的
等待列表的生成,然后处理该列表,因此使用文件名执行重命名,就像最初一样。如果重命名文件,则由
findstr
创建的列表不能包含新文件名,因为执行
findstr
时新文件名不存在,因此重命名的文件将不会永久重命名。@kaputtz:但是,请注意,如果文件
名称
名称(1)
名称(2)
存在,每个文件都包含字符串
name
1<代码>名称
将被重命名为
名称(3)
(因为这是第一个不存在的
名称(?)
)<代码>名称(1)
将被重命名为
名称
,因为
名称
已不存在,然后重命名为3<代码>名称(2)
将被重命名为
名称(1)
,因为
名称(1)
不再存在。谢谢您的评论/回复!
 if exist "%searchfor%.txt" (
  set "renamed="
  for /L %%r in (1,1,100) do if not defined renamed if not exist "%searchfor% (%%r).txt" REN "%%a" "%searchfor% (%%r).txt"&set "renamed=%%r"

  ) else (
  REN "%%a" "%searchfor%.txt"
 )