2014-05-04 38 views
1

我试图创建一个批处理文件来重命名文件夹中的一堆文件。这些文件会有一些类似的命名:blah(lol).txt。总是会有四个字母,然后是一个开放的括号,三个字母,最后是一个右括号。批量重命名文件的最后几个字符

我想要批处理文件删除文件的名称,即括号内的部分。重命名没有括号部分的文件。

for %%i IN (*.txt) DO (set name=%%~ni 
    set name2=%name:~1,4% 
    ren %%i %name2%) 

为什么不能正常工作?

回答

1
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
FOR /f "tokens=1,2,3delims=()" %%a IN (
    'dir /b /a-d "%sourcedir%\*(*).*" ' 
) DO ECHO REN "%sourcedir%\%%a(%%b)%%c" %%a%%b%%c 

GOTO :EOF 

所需REN命令仅仅是ECHO编用于测试目的。 验证命令是否正确后,将ECHO REN更改为REN以实际重命名文件。

在块语句(a parenthesised series of statements),所述整个块被解析并然后执行。该块内的任何%var%将在该块被解析时由该变量的值取代 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)

因此,在遇到IF时,将使用%variables%的值执行IF (something) else (somethingelse)。克服这个

两种常用方法是:1)使用setlocal enabledelayedexpansion并使用!var!代替%var%访问的var改变的值或2),以调用一个子程序使用改变的值来执行进一步的处理。

2

Magoo提供了一个解释,为什么你的脚本失败,以及一个工作脚本。

但在你的情况下,不需要脚本。一个简单的REN命令就是所有需要的:

ren "????(???).txt" "????.*" 
0

简单,但工作从文件夹与待重命名的文件。

@echo off 
title Rename Bat 
echo This bat must be in the folder that 
echo contains the files to be renamed. 
:begin 
echo Enter File Name 
set /p old= 
echo Enter New Name 
set /p new= 
ren "%old%" "%new%" 
echo File Renamed 
ping -n 3 127.0.0.1 >NUL 
goto begin 
-1

一个更简单的方法...尝试一个for循环,通过你的文件夹中的所有文件循环

我打算用笑作为括号内三个字母词的例子作为说明你的问题

关闭@echo

为%%一中(*)做(

重命名 “%%一”, “一%%(笑).EXE”

使用你必须把它包含你要的文件的文件夹在此批处理文件重命名

+0

是的,除非他们想*删除*括号内的一部分,而不是添加它。你也错过了'%% a'会引用完整名称的事实,包括扩展名,所以'(lol)。在你的脚本中的EXE''不会取代原来的扩展名,而是在它后面追加。 –