[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理用文件內容批次改名?

大家好, 小弟最近要為公司整理一堆很舊的文件, 大概有幾千個, 全部放於同一文件夾內, 每個文件如附件, 為了方便分類, 想將文件改名為有規律的方式, 由於文件大致上類同, 有辦法用 .bat 批處理不改動文件內容進行改名嗎?

改名分式如下
第三行括号裹的字 + 空格 + 第二行 / 前的7個字元 + 第二行 / 後的4個字元
即附件要改名為 "ORDER J133333CNGR"

小弟為新手, 上網看了很多, 也只能寫/改出以下的 code, 把檔案名改成文件內容第一行
  1. @echo off
  2. for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
  3.     call :label "%%i"
  4. )
  5. pause
  6. exit
  7. :label
  8.     for /f "delims=" %%j in ('type %1') do (
  9.         ren %1 "%%j".txt&goto :eof
  10. )
  11. goto :eof
复制代码
謝謝各位大俠指教!
1

评分人数

    • batman: 感谢给帖子标题标注[已解决]字样PB + 2

cutebe 发表于 2012-12-13 20:28


高手高手, 先研究一下, 謝了 !

TOP

本帖最后由 cutebe 于 2012-12-13 20:32 编辑
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. SET FG=---
  4. FOR /F "DELIMS=" %%T IN ('DIR/B *.TXT')DO (
  5.  SET ORS=&SET ORT=&SET TIT=&SET A=
  6.  CALL :CN "%%T"
  7.  ECHO,REN "%%T" "!ORT!!TIT!!ORS:/=!%%~XT"
  8. )
  9. PAUSE
  10. GOTO :EOF
  11. :CN FILE
  12. FOR /F "SKIP=1 TOKENS=1* DELIMS=:" %%M IN ('TYPE "%~1"^|FINDSTR /N .*')DO (
  13.  SET "S=%%N "
  14.  IF %%M#==2# SET "ORS=!S:~60,12!"
  15.  IF %%M#==3# SET "ORT=!S:~4,5!"
  16.  IF NOT "!S:%FG%=!"=="!S!" IF NOT DEFINED A SET/aA=%%M+3
  17.  IF %%M#==!A!# SET "TIT=!S!"&GOTO :EOF
  18. )
复制代码
如无特别说明,代码测试环境均为 XP SP3

TOP

謝謝兩位大俠, 問題已解決. 兩個方法也完全符合要求! 又學到新東西了!謝!

各位大大如不吝指教, 我想多學一點
用其中一代碼進行了一點修改
  1. @echo off
  2. set abc= --------------------------------------------------------------------------
  3. for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
  4.   set "Name=%%i"
  5.   for /f "tokens=1* delims=[]" %%a in ('find /v /n ""^<"%%i"') do (
  6.     if %%a equ 2 (
  7.       for %%d in (%%b) do set "a=%%d"
  8.     )
  9.     if %%a equ 3 (
  10.       for /f "delims=() " %%d in ("%%b") do set "b=%%d"
  11.     )
  12.     if %%a equ 21=(
  13.       for /f "delims=        " %%d in ("%%b") do set "c=%%d"   
  14.     )
  15.   )
  16.   setlocal enabledelayedexpansion
  17.   Ren "!Name!" "!b!!c! !a:/=!.txt"
  18.   endlocal
  19. )
  20. Pause
复制代码
此代碼會運行
第三行第 5 至第9 個字元 + 第 21 行 + / 前第二行61 至 67 個字元 +  / 後第二行69 至 72 個字元
以附件 A1 為例, 檔案名會改成IF001 IF ABC CDA ABC 123 A195001POAS
但如用在 A2, 檔案名會改成IF001 3210987654321                               20    1.85  35.00      A195001POAS
因我想取得資料的行數於此檔案應為第 20 行

我想請問: 有辦法用條件分類,
如第 19 行等於 --------------------------------------------------------------------------
就取第 20行
否則如如第 20 行等於 --------------------------------------------------------------------------
就取第 21行

如各大俠看完後發覺有更好的方法進行條件分類, 亦請賜教. 感激!

TOP

本帖最后由 cutebe 于 2012-12-13 16:50 编辑

测试方法同上
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. FOR /F "DELIMS=" %%T IN ('DIR/B *.TXT')DO (
  4.  SET ORS=&SET ORT=
  5.  FOR /F "TOKENS=1* DELIMS=:" %%M IN ('TYPE "%%T"^|FINDSTR /N "\. ("')DO (
  6.   SET "STR=%%N"
  7.   IF %%M#==2# SET "ORS=!STR:~59,16!"
  8.   IF %%M#==3# SET "ORT=!STR:~4,5!"
  9.  )
  10.  ECHO,REN "%%T" "!ORT!!ORS:/=!%%~XT"
  11. )
  12. PAUSE
复制代码
如无特别说明,代码测试环境均为 XP SP3

TOP

  1. @echo off
  2. for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
  3.   set "Name=%%i"
  4.   for /f "tokens=1* delims=[]" %%a in ('find /v /n ""^<"%%i"') do (
  5.     if %%a equ 2 (
  6.       for %%c in (%%b) do set "a=%%c"
  7.     )
  8.     if %%a equ 3 (
  9.       for /f "delims=() " %%c in ("%%b") do set "b=%%c"
  10.     )
  11.   )
  12.   setlocal enabledelayedexpansion
  13.   Ren "!Name!" "!b! !a:/=!.txt"
  14.   endlocal
  15. )
  16. pause
复制代码

TOP

同上, 如有高手認為新要求用批處理不太可行, 亦煩請告知, 那我再想其他辦法吧.... 謝

TOP

如果文件格式统一,请在测试结果正确后将 ECHO, 五个字符删除。
cutebe 发表于 2012-12-13 09:26


Cutebe兄, 謝謝你的回覆, 很強大. 亦完全符合我所說的. 謝.

但運作後我發現一個問題, 原來我的檔案裡, 有大概五分一在第二行是有括号括著年份的. 如附件. 亦有極少部分於第二行較前位置有/符号, 故尋找第一個括号及 / 的方法原來會有漏洞, 抱歉現在才發現.

但括号內的字必定是在第三行第 5 至第9 個字元 (例子: 第三行依次序為 空格, 空格, 空格, 開括号, o, t, h, e, r)  
/ 前的字必定是在第二行61 至 67 個字元,  
/ 後的字必定是在第二行69 至 72 個字元
因此請問有辦法以字元位置的方式運行嗎? 如不行也不要緊, 已經幫了很大的忙, 謝!

TOP

  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. FOR /F "DELIMS=" %%T IN ('DIR/B *.TXT')DO (
  4.  SET ORS=&SET ORT=
  5.  FOR /F "DELIMS=" %%A IN ('TYPE "%%T"^|FINDSTR /N "\. ("')DO (
  6.   SET "STR=%%A"
  7.   SET STR=!STR:*.=!
  8.   IF NOT DEFINED ORS SET ORS=!STR:*:=!
  9.   FOR /F "TOKENS=2 DELIMS=()" %%B IN ("%%A")DO (
  10.    IF NOT DEFINED ORT SET ORT=%%B
  11.   )
  12.  )
  13.  CALL :CN "%%T" ORS !ORT!
  14. )
  15. PAUSE
  16. GOTO :EOF
  17. :CN STR1VAR STR2
  18. ECHO,REN %1 "%3!%2:/=!%~X1"
复制代码
如果文件格式统一,请在测试结果正确后将 ECHO, 五个字符删除。
如无特别说明,代码测试环境均为 XP SP3

TOP

本帖最后由 nickl 于 2012-12-12 23:53 编辑

回复 1# nickl
如有高手認為用批處理不太可行, 亦煩請告知, 那我再想其他辦法吧.... 謝

TOP

返回列表