首页 > 解决方案 > 批处理文件重命名器

问题描述

@echo off
ren "(1) Rare Imports Exclusive.txt" "1RareImportsExclusive.txt"

set "replace="unid": 0,"
set "replaced="unid": 1,"

set "source=1RareImportsExclusive.txt"
set "target=1RareImportsExclusive1.txt"

setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%replace%=%replaced%!"
echo(!line!
)
) > %target%

ren "1RareImportsExclusive1.txt" "(1) Rare Imports Exclusive.txt"
del "1RareImportsExclusive.txt"
endlocal

我已经更新了我的原始帖子

我有超过 1000 个 .txt 文件,每个文件的内容中都有一个
带有随机数的 UNID 代码

我的目标是拥有 1 个可以忽略所有随机数并
根据文件号重命名 unid 的 bat 文件

原始文件
(1) Rare Imports Exclusive.txt
-------- "unid": 2548,"

结果文件
(1) Rare Imports Exclusive.txt
------- "unid": 1,"


如果我将所有 unid 更改为 0,并且如果我制作 1000 个 .bat 文件,我只能让它工作

所以我制作了尽可能多的批处理文件并将它们合并
这暂时有效

标签: batch-file

解决方案


@ECHO Off
setlocal ENABLEDELAYEDEXPANSION

set "replacemain="unid": "

SET "sourcedir=u:\sourcedir\t w o"
SET "destdir=u:\destdir"

FOR /f "delims=" %%q IN ('dir /b /a-d "%sourcedir%\(*)*.txt"') DO (

(

 FOR /f "tokens=1 delims=()" %%j IN ("%%q") DO (
  rem %%j now has sequence number
  for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%sourcedir%\%%q"') do (
   set "line=%%b"
   if defined line IF "%%b" neq "!line:unid=!" CALL :subs %%j
   echo(!line!
  )
 )

)>"%destdir%\%%q"

)
GOTO :eof

:: substitute
:subs
SET "original=%line%"
FOR /L %%s IN (0,1,9) DO set "line=!line:%replacemain%%%s=%replacemain%!"
IF "%original%" neq "%line%" goto subs
set "line=!line:%replacemain%=%replacemain%%1!"
GOTO :eof

当我读到它时,这个问题与重命名文件无关,而是改变它们的内容。

您将需要更改设置sourcedirdestdir适应您的情况。该清单使用适合我的系统的设置。

我故意在名称中包含空格以确保正确处理它们。

因此,假设源目录中的文件名遵循该模式(?) filename.txt,并且所需的工作是将字符串替换为"unid": ##,("unid": ?,其中##是一个随机数,?是文件名中的数字...

获取文件名%%q并将文件编号导出为%%j.

阅读和反刍。检测该行是否包含unid等,并使用 进一步处理这些:subs

:subs,替换unid等。字符串后跟一个数字,然后是不带数字的字符串。如果进行了任何更改,请重复。然后替换为例程%%j传递。%1:subs

--- 包含子目录的修订。

@ECHO Off
setlocal ENABLEDELAYEDEXPANSION

:: Significant part of string

set "replacemain="unid": "

SET "sourcedir=u:\your files"
SET "destdir=u:\your results"

FOR /f "delims=" %%q IN ('dir /b /s /a-d "%sourcedir%\(*)*.txt"') DO (
 rem calculate new destination directory
 SET "newdest=%%~dpq"
 SET "newdest=!newdest:%sourcedir%=%destdir%!"
 SET "newdest=!newdest:~0,-1!"
 MD "!newdest!" 2>nul

(
 FOR /f "tokens=1 delims=()" %%j IN ("%%~nxq") DO (
  rem %%j now has sequence number
  for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%%q"') do (
   set "line=%%b"
   if defined line IF "%%b" neq "!line:unid=!" CALL :subs %%j
   echo(!line!
  )
 )
)>"!newdest!\%%~nxq" 

)
GOTO :eof

:: substitute
:subs
SET "original=%line%"
FOR /L %%s IN (0,1,9) DO set "line=!line:%replacemain%%%s=%replacemain%!"
IF "%original%" neq "%line%" goto subs
set "line=!line:%replacemain%=%replacemain%%1!"
GOTO :eof

您将需要更改分配给sourcedirdestdir适合您的情况的值。该清单使用适合我的系统的设置。

我故意在名称中包含空格以确保正确处理空格。

首先,/sdir命令中添加导致扫描子目录。这意味着%%q将包含适合掩码的每个文件的绝对文件名(*)*.txt

由于目标目录现在可能会更改,newdest因此通过将 的值替换为sourcedir的值destdir并删除最后一个\字符来计算,因为%%~dpq将提供-\终止的字符串。

然后使用md指令创建如此计算的目录,并且系统的任何反对(因为它可能已经存在目录)被丢弃2>nul(无处发送错误消息)。

由于原来只包含文件名,所以在计算时%%q需要专门选择%%q( )的名称和扩展名。%%~nxq%%j

由于%%q包含绝对文件名,我们使用 .%sourcedir%从文件读取循环中删除%%a.

最后,需要从源文件的计算newdest和名称+扩展名中构造目标文件。

--- 重新修订

@ECHO Off
setlocal ENABLEDELAYEDEXPANSION

:: Significant part of string

set "replacemain="unid": "

SET "sourcedir=u:\your files"
SET "destdir=u:\your results"

:: for tracking directory-changes
SET "lastdir="

SET /a serial=1

FOR /f "delims=" %%q IN ('dir /b /s /a-d "%sourcedir%\(*)*.txt"') DO (
 rem use following line to restart serial number for each file
 REM SET /a serial=1
 if "!lastdir!" neq "%%~dpq" (
  rem use following line to restart serial number for each directory
  REM SET /a serial=1
  rem calculate new destination directory
  SET "newdest=%%~dpq"
  SET "lastdir=%%~dpq"
  SET "newdest=!newdest:%sourcedir%=%destdir%!"
  SET "newdest=!newdest:~0,-1!"
  MD "!newdest!" 2>NUL
 )

(
 rem %%j will acquire sequence number for filename pattern (*)*.txt
 REM FOR /f "tokens=1 delims=()" %%j IN ("%%~nxq") DO SET "serial=%%j"
 rem use following line to select a random serial number for each file
 REM CALL :randsn

 for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%%q"') do (
  set "line=%%b"
  if defined line IF "%%b" neq "!line:unid=!" CALL :subs 
  echo(!line!
 )
)>"!newdest!\%%~nxq" 

)
GOTO :eof

:: substitute
:subs
SET "original=%line%"
FOR /L %%s IN (0,1,9) DO set "line=!line:%replacemain%%%s=%replacemain%!"
IF "%original%" neq "%line%" goto subs
set "line=!line:%replacemain%=%replacemain%%serial%!"
SET /a serial+=1
GOTO :eof

:randsn
SET /a serial=%RANDOM%
:: Ignore selections 30000..32767 for even distribution
IF %serial% geq 30000 GOTO randsn
:: Use 10000 for 4-digit maximum, 1000 for 3, 100 for 2
SET /a serial=serial %% 10000
:: Use the following line if 0 is not allowed
IF %serial%==0 GOTO randsn
GOTO :eof

这提供了如何计算数字的选择。

要激活任何特定选项,REM请将注释后面的行中的更改为 (无)。尝试在任何时候激活多个选项可能会很疯狂。要取消选择一个选项,请将REM 关键字放回原处。

random 选项将生成一个随机的 1-4 位数字。绝对不能保证在这种情况下插入的数字是唯一的。

要允许例程对树中的任何文件进行操作,只需将文件掩码更改(*)*.txt为其他文件掩码,注意不以(number)via开头的文件名的序列号派生%%j将变得毫无意义,因此serialfrom的设置%%j应该是 de-用rem声明激活(如发布)


推荐阅读