Переименовать все файлы в каталоге на основе текста, который они содержат - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь перебрать все файлы .lss в папке и получить строку, которая существует между двумя тегами, сохранить это значение и переименовать файл, используя эту строку.

Пример:

42982934829.lss -> contains string:

<surveyls_title><![CDATA[J.3200-1118 - Project Title]]></surveyls_title>

Rename to `J.3200-1118 - Project Title.lss`

Вот то, что я имею до сих пор, но я боюсь, что мой синтаксис очень неправильный ..

@Echo off
Set Folder=X:\RenameTest
Set Files=*.lss
PushD %Folder%

For %%A in (%Files%) Do For /f %%B IN (
  'findstr "<surveyls_title>.*</surveyls_title>" "%ProjectTitle%"'
    ) Do Call :Rename ..
PopD
Goto :Eof

:Rename
Echo Ren %1 "%ProjectTitle%"

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Полагаю, это то, что вам нужно.

@echo off
pushd "X:\RenameTest"
for %%a in (*.lss) do for /f "tokens=3*delims=[]" %%i in ('type "%%a" ^| find "</surveyls_title>"') do echo ren "%%~a" "%%~i%%~xa"
popd

Просто удалите echo из строки, как только вы будете довольны напечатанными результатами.

1 голос
/ 08 ноября 2019

Вы также можете извлечь заголовок с помощью регулярных выражений: Демо здесь

@echo off & color 0A
Title Extract Title using Regex
Set "InputFile=42982934829.lss"
Call :Extract_Title "%InputFile%" Title
Echo %Title%
Pause & Exit
::----------------------------------------------------------------------------------------
:Extract_Title <InputFile> <Title to be Set>
(
echo WScript.StdOut.WriteLine Extract_Title(Data^)
echo Function Extract_Title(Data^)
echo      Data = WScript.StdIn.ReadAll  
echo      Set re = New RegExp 
echo      re.Global = True 
echo      re.IgnoreCase = True  
echo      re.Pattern = "\[CDATA\[(.*?)\]\]" 
echo      For Each Match in re.Execute(Data^) 
echo          Title = Match.SubMatches(0^) 
echo      Next  
echo     Extract_Title = Title
echo End Function
)>"%tmp%\%~n0.vbs"
for /f "delims=" %%A in ('cscript /nologo "%tmp%\%~n0.vbs" ^< "%~1"') do set "%2=%%A"
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
Exit /B
::----------------------------------------------------------------------------------------
...