Batch file 重命名文件名中有KB编号的文件

Batch file 重命名文件名中有KB编号的文件,batch-file,Batch File,我正在尝试创建一个批处理脚本来重命名目录中的文件。所有文件名都存储在一个文本文件中,我正在脚本中读取它们。文件名是microsoft发布的更新。由于下载的文件名不是模式格式,我很难重命名数百个文件。对于eample,如果文件名为-windows6.1-KB1234567 update for_IE10 for RCE.msu,我想将其重命名为KB1234567,我通过在delims中使用成功地编写了重命名脚本,其中KB编号位于括号内,但我无法从上述类型的文件中获取KB编号。KB数字介于连字符和空

我正在尝试创建一个批处理脚本来重命名目录中的文件。所有文件名都存储在一个文本文件中,我正在脚本中读取它们。文件名是microsoft发布的更新。由于下载的文件名不是模式格式,我很难重命名数百个文件。对于eample,如果文件名为-windows6.1-KB1234567 update for_IE10 for RCE.msu,我想将其重命名为KB1234567,我通过在delims中使用成功地编写了重命名脚本,其中KB编号位于括号内,但我无法从上述类型的文件中获取KB编号。KB数字介于连字符和空格之间。当我尝试使用findstr或find命令时,ERRORLEVEL开始给出错误的返回代码。即使找到或未找到KB字,它也返回零。因此,我正在寻找一个快速修复这个要求。 EDIT1:我用来查找括号中的KB数字的脚本

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命令的errorlevel。它将拆分由连字符分隔的单词,并检查是否存在连字符。但无论我做什么,即使它在单独的单词中找到KB单词的匹配项,返回的ErrorLevel都是零。为了简单起见,我现在只给脚本,它将选择第三个单词并在其中查找kb。第三个文件名在第三个单词中没有KB,但该文件名的errorlevel也为零


感谢你的留言,因为在这里粘贴一个答案时,两个点丢失了:

我建议从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".
您的%errorlevel%问题是一个问题

您可以在一个循环中完成所有操作,而不是单独处理每种格式:

@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 1替换为kb。 从该字符串中,取任何分隔符-\之前的第一部分。 然后将文件%%ato重命名为提取的KBxxxxxx'加上原始扩展名%%xa'

1谢天谢地,在这种情况下,替换不区分大小写。它处理所有KB、KB、KB和KB的方式相同

在通过删除ECHO启用ren命令之前,请检查输出

您可以通过将外部设置更改为以下方式来处理每个文件,而不是您自己生成的文本文件:


非常感谢您提供迄今为止编写的脚本。ack!!我已经用用于查找括号中包含KB数字的文件名的脚本编辑了我的问题。您发布的代码并不是试图在没有括号的情况下提取KB数字,尽管这对于您的问题更有趣…aschipfl!!我还将简化脚本放在EDIT2Stephan中。工作出色。非常感谢。它节省了3天的体力劳动。你能让我参考一些博客来了解你使用的设置参数和delims参数的高级用法吗。和没有什么先进的东西。它只是一个应该用作分隔符的字符集合。我建议你把它收藏起来并经常浏览。
@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"
)
for /f "delims=" %%a in ('dir /b "D:\updates\*.msu"') do (