Переименование файлов с номером КБ в имени файла - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь сделать пакетный скрипт для переименования файлов в каталоге.Все имена файлов хранятся в текстовом файле, и я читаю их в сценарии.Имена файлов - это обновления, выпущенные Microsoft.Поскольку загруженные имена файлов не в шаблонном формате, у меня возникают трудности с переименованием сотен файлов.например, если имя файла - windows6.1-KB1234567, обновление for_IE10 для RCE.msu
Я хочу переименовать его в KB1234567
Я получил успех в сценариипереименование, где номер КБ находится внутри скобок с помощью () в разделителях, но я застрял при получении номеров КБ из вышеупомянутых видов файлов.Где-то числа КБ находятся между дефисами и где-то между пробелами.

Также ERRORLEVEL начинает давать неверный код возврата, когда я пытаюсь использовать команду findstr или find .Возвращает ноль, даже если слово KB найдено или нет.
Итак, я ищу быстрое решение для этого требования.
EDIT1: скрипт, который я использовал для поиска номеров КБ в квадратных скобках

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=()" %%x in (D:\updates\list1.txt) do (
echo %%y

EDIT2: код, который я пытаюсьis: -

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.Третье имя файла не имеет КБ, это третье слово, но уровень ошибки для этого имени файла также равен нулю.



Спасибо
Kriss

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Ваша %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.
Из этой строки возьмите первую часть перед любым из разделителей ()-_<space>.
Затем переименуйте файл %%a в извлеченный KBxxxxxx' plus the original extension ( %% ~ xa ').

(1)к счастью (в этом случае), замена не чувствительна к регистру.Он обрабатывает все KB, kb, Kb и kB одинаково.

проверьте вывод перед включением команды ren, удалив ECHO

Вместо текстового файла (который вы, вероятно, сгенерировали самостоятельно, чтобы иметь возможность его обрабатывать), вы можете обрабатывать каждый из файлов, изменив внешний for на:

for /f "delims=" %%a in ('dir /b "D:\updates\*.msu"') do (
0 голосов
/ 28 сентября 2018

Поскольку две точки теряются при вставке в комментарий здесь, ответ:

Я предлагаю использовать однострочную команду Powershell из cmd:

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".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...