标题: [文本处理] [已解决]批处理用文件內容批次改名? [打印本页]
作者: nickl 时间: 2012-12-12 21:50 标题: [已解决]批处理用文件內容批次改名?
大家好, 小弟最近要為公司整理一堆很舊的文件, 大概有幾千個, 全部放於同一文件夾內, 每個文件如附件, 為了方便分類, 想將文件改名為有規律的方式, 由於文件大致上類同, 有辦法用 .bat 批處理不改動文件內容進行改名嗎?
改名分式如下
第三行括号裹的字 + 空格 + 第二行 / 前的7個字元 + 第二行 / 後的4個字元
即附件要改名為 "ORDER J133333CNGR"
小弟為新手, 上網看了很多, 也只能寫/改出以下的 code, 把檔案名改成文件內容第一行- @echo off
- for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
- call :label "%%i"
- )
- pause
- exit
-
- :label
- for /f "delims=" %%j in ('type %1') do (
- ren %1 "%%j".txt&goto :eof
- )
- goto :eof
复制代码
謝謝各位大俠指教!
作者: nickl 时间: 2012-12-12 23:51
本帖最后由 nickl 于 2012-12-12 23:53 编辑
回复 1# nickl
如有高手認為用批處理不太可行, 亦煩請告知, 那我再想其他辦法吧.... 謝
作者: cutebe 时间: 2012-12-13 09:26
- @ECHO OFF
- SETLOCAL ENABLEDELAYEDEXPANSION
- FOR /F "DELIMS=" %%T IN ('DIR/B *.TXT')DO (
- SET ORS=&SET ORT=
- FOR /F "DELIMS=" %%A IN ('TYPE "%%T"^|FINDSTR /N "\. ("')DO (
- SET "STR=%%A"
- SET STR=!STR:*.=!
- IF NOT DEFINED ORS SET ORS=!STR:*:=!
- FOR /F "TOKENS=2 DELIMS=()" %%B IN ("%%A")DO (
- IF NOT DEFINED ORT SET ORT=%%B
- )
- )
- CALL :CN "%%T" ORS !ORT!
- )
-
- PAUSE
- GOTO :EOF
- :CN STR1VAR STR2
- ECHO,REN %1 "%3!%2:/=!%~X1"
复制代码
如果文件格式统一,请在测试结果正确后将 ECHO, 五个字符删除。
作者: nickl 时间: 2012-12-13 11:24
如果文件格式统一,请在测试结果正确后将 ECHO, 五个字符删除。
cutebe 发表于 2012-12-13 09:26
Cutebe兄, 謝謝你的回覆, 很強大. 亦完全符合我所說的. 謝.
但運作後我發現一個問題, 原來我的檔案裡, 有大概五分一在第二行是有括号括著年份的. 如附件. 亦有極少部分於第二行較前位置有/符号, 故尋找第一個括号及 / 的方法原來會有漏洞, 抱歉現在才發現.
但括号內的字必定是在第三行第 5 至第9 個字元 (例子: 第三行依次序為 空格, 空格, 空格, 開括号, o, t, h, e, r)
/ 前的字必定是在第二行61 至 67 個字元,
/ 後的字必定是在第二行69 至 72 個字元
因此請問有辦法以字元位置的方式運行嗎? 如不行也不要緊, 已經幫了很大的忙, 謝!
作者: nickl 时间: 2012-12-13 14:15
同上, 如有高手認為新要求用批處理不太可行, 亦煩請告知, 那我再想其他辦法吧.... 謝
作者: apang 时间: 2012-12-13 14:25
- @echo off
- for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
- set "Name=%%i"
- for /f "tokens=1* delims=[]" %%a in ('find /v /n ""^<"%%i"') do (
- if %%a equ 2 (
- for %%c in (%%b) do set "a=%%c"
- )
- if %%a equ 3 (
- for /f "delims=() " %%c in ("%%b") do set "b=%%c"
- )
- )
- setlocal enabledelayedexpansion
- Ren "!Name!" "!b! !a:/=!.txt"
- endlocal
- )
- pause
复制代码
作者: cutebe 时间: 2012-12-13 15:14
本帖最后由 cutebe 于 2012-12-13 16:50 编辑
测试方法同上- @ECHO OFF
- SETLOCAL ENABLEDELAYEDEXPANSION
- FOR /F "DELIMS=" %%T IN ('DIR/B *.TXT')DO (
- SET ORS=&SET ORT=
- FOR /F "TOKENS=1* DELIMS=:" %%M IN ('TYPE "%%T"^|FINDSTR /N "\. ("')DO (
- SET "STR=%%N"
- IF %%M#==2# SET "ORS=!STR:~59,16!"
- IF %%M#==3# SET "ORT=!STR:~4,5!"
- )
- ECHO,REN "%%T" "!ORT!!ORS:/=!%%~XT"
- )
- PAUSE
复制代码
作者: nickl 时间: 2012-12-13 17:29
謝謝兩位大俠, 問題已解決. 兩個方法也完全符合要求! 又學到新東西了!謝!
各位大大如不吝指教, 我想多學一點
用其中一代碼進行了一點修改- @echo off
- set abc= --------------------------------------------------------------------------
- for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
- set "Name=%%i"
- for /f "tokens=1* delims=[]" %%a in ('find /v /n ""^<"%%i"') do (
- if %%a equ 2 (
- for %%d in (%%b) do set "a=%%d"
- )
- if %%a equ 3 (
- for /f "delims=() " %%d in ("%%b") do set "b=%%d"
- )
- if %%a equ 21=(
- for /f "delims= " %%d in ("%%b") do set "c=%%d"
- )
- )
-
- setlocal enabledelayedexpansion
- Ren "!Name!" "!b!!c! !a:/=!.txt"
- endlocal
- )
- 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行
如各大俠看完後發覺有更好的方法進行條件分類, 亦請賜教. 感激!
作者: cutebe 时间: 2012-12-13 20:28
本帖最后由 cutebe 于 2012-12-13 20:32 编辑
- @ECHO OFF
- SETLOCAL ENABLEDELAYEDEXPANSION
- SET FG=---
- FOR /F "DELIMS=" %%T IN ('DIR/B *.TXT')DO (
- SET ORS=&SET ORT=&SET TIT=&SET A=
- CALL :CN "%%T"
- ECHO,REN "%%T" "!ORT!!TIT!!ORS:/=!%%~XT"
- )
- PAUSE
- GOTO :EOF
- :CN FILE
- FOR /F "SKIP=1 TOKENS=1* DELIMS=:" %%M IN ('TYPE "%~1"^|FINDSTR /N .*')DO (
- SET "S=%%N "
- IF %%M#==2# SET "ORS=!S:~60,12!"
- IF %%M#==3# SET "ORT=!S:~4,5!"
- IF NOT "!S:%FG%=!"=="!S!" IF NOT DEFINED A SET/aA=%%M+3
- IF %%M#==!A!# SET "TIT=!S!"&GOTO :EOF
- )
复制代码
作者: nickl 时间: 2012-12-14 09:11
cutebe 发表于 2012-12-13 20:28
高手高手, 先研究一下, 謝了 !
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |