2014-05-04 40 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''不會取代原來的擴展名,而是在它後面追加。 –