batch-file - 批处理文件重命名器
问题描述
@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 文件,我只能让它工作
所以我制作了尽可能多的批处理文件并将它们合并
这暂时有效
解决方案
@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
当我读到它时,这个问题与重命名文件无关,而是改变它们的内容。
您将需要更改设置sourcedir
以destdir
适应您的情况。该清单使用适合我的系统的设置。
我故意在名称中包含空格以确保正确处理它们。
因此,假设源目录中的文件名遵循该模式(?) 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
您将需要更改分配给sourcedir
并destdir
适合您的情况的值。该清单使用适合我的系统的设置。
我故意在名称中包含空格以确保正确处理空格。
首先,/s
在dir
命令中添加导致扫描子目录。这意味着%%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
将变得毫无意义,因此serial
from的设置%%j
应该是 de-用rem
声明激活(如发布)
推荐阅读
- windows - Windows Server 2016/2019 在 Owin.dll 上错误地返回 Authenticode 签名
- c# - 接收连续输入呼叫的最佳方式?
- flutter - 不带参数调用 onGenerateRoute 函数
- swift - 导航标题上方的大空间(Swift / SwiftUI)
- c++ - 根据 std::tuple 的大小更改函数的返回类型
- android - 仅限 Android Webrtc 视频
- java - 为什么 Volley 不在 getParams() 中发送变量?
- google-apps-script - 例外:发送电子邮件失败:没有收件人
- unity3d - 我将如何在unity2d中向障碍物物理投掷球?
- python - 气流 - 每 2 小时运行一次