重命名文件名中具有KB号的文件

时间:2018-09-28 05:58:00

标签: batch-file

我正在尝试制作一个批处理脚本来重命名目录中的文件。所有文件名都存储在一个文本文件中,我正在脚本中读取它们。文件名是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)

2 个答案:

答案 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)值得庆幸的是(在这种情况下),替换不区分大小写。它将所有kbKbkBren都相同地处理。

在通过删除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".