我正在尝试制作一个批处理脚本来重命名目录中的文件。所有文件名都存储在一个文本文件中,我正在脚本中读取它们。文件名是Microsoft发布的更新。由于下载的文件名不是模式格式,因此我很难重命名数百个文件。例如,如果文件名为- windows6.1-KB1234567 for RCE.msu的for_IE10更新
我想将其重命名为 KB1234567
通过在delims中使用()成功编写了将KB号放在方括号内的重命名脚本,但我坚持从上述类型的文件中获取KB号。 KB号在连字符之间,空格之间。
当我尝试使用 findstr 或 find 命令时,ERRORLEVEL也开始提供错误的返回码。即使未找到KB字,它也会返回零。
所以我正在寻找一种快速解决此问题的方法。
EDIT1:我用来查找用方括号括起来的KB号的脚本
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=()" %%x in (D:\updates\list1.txt) do (
echo %%y
EDIT2:我正在尝试的代码是:-
for /f "tokens=1-10 delims=-" %%a in (D:\updates\list2.txt) do (
echo %%c | find /I "kb"
echo Errorlevel for matching KB in %%c is- %ERRORLEVEL%
)
list2.txt文件包含(示例文件名):
ie11-windows6.1-kb123456-x86_d43434342344ef.msu
IE8-windows6.0-KB234567-X86.msu
windows6.1-kb345678-x86_cae45678123_nov_17.msu
目前,我的目标是带有连字符的文件名。完成后,我将为包含空格的文件名编写脚本。 我创建的EDIT2脚本仅用于测试find命令的错误级别。它将拆分由连字符分隔的单词,并检查是否存在连字符。但是无论我做什么,即使它找到或不找到单独单词中的KB单词都匹配,返回的ErrorLevel也为零。为了简单起见,我现在提供的脚本将选择第三个单词并在其中找到kb。第三个文件名第三个单词没有KB,但是该文件名的错误级别也为零。
感谢
克里斯(Kriss)
答案 0 :(得分:1)
您的%errorlevel%
问题是delayed expansion problem。
您可以在一个循环中完成所有操作,而不必自己处理每种格式:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (D:\updates\list.txt) do (
set "kb=%%a"
set "kb=!kb:*kb=KB!"
for /f "delims=()-_ " %%b in ("!kb!") do set "kb=%%b"
ECHO ren "%%a" "!kb!%%~xa"
)
首先,将行分配给变量以能够进行子字符串替换。
然后用kb
替换“从头开始到*kb
并包括KB
)(()-_<space>
)(1)。
从该字符串开始,在任何定界符%%a
之前加入第一部分。
然后将文件KBxxxxxx' plus the original extension (
重命名为提取的KB
%%〜xa')。
(1)值得庆幸的是(在这种情况下),替换不区分大小写。它将所有kb
,Kb
,kB
和ren
都相同地处理。
在通过删除ECHO
for
命令之前检查输出
您可以通过将外部for /f "delims=" %%a in ('dir /b "D:\updates\*.msu"') do (
更改为:
area
答案 1 :(得分:0)
由于在此处粘贴评论时丢失了两个点,所以答案是:
我建议从cmd内部使用Powershell一行命令:
powershell -nop -c "gci '*KB[0-9]*'|? Name -match '.*(KB\d+).*'|ren -newname {$Matches[1]+$_.Extension}"
它使用正则表达式grep KB和相邻数字。
在没有别名的情况下,PowerShell脚本也更加冗长:
Get-ChildItem '.*KB[0-9].*' |
Where-Object Name -match '.*(KB\d+).*' |
Rename-Item -NewName {$Matches[1]+$_.Extension}" -WhatIf
输出带有示例和附加的-WhatIf
参数
> gci '*KB[0-9]*'|? Name -match '.*(KB\d+).*'|ren -newname {$Matches[1]+$_.Extension} -whatif
WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das Ziel
"Element: ie11-windows6.1-kb123456-x86_d43434342344ef.msu Ziel: kb123456.msu".
WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das Ziel
"Element: IE8-windows6.0-KB234567-X86.msu Ziel: KB234567.msu".
WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das Ziel
"Element: windows6.1-KB1234567 update for_IE10 for RCE.msu Ziel: KB1234567.msu".