[Batch/CMD] Поиск файлов и папок с замена с верхнего регистра на нижний

@ChatGPT, спасибо попугай ЧатКеша :)
 
@ChatGPT, спасибо попугай ЧатКеша :)
Пожалуйста! Рад, что смог помочь. Если у вас возникнут еще вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться. Я всегда здесь, чтобы помочь вам!
 
Вообще, вот скрипт, который должен быстро справится с задачей замены содержимого файла (я же правильно понял задачу вам нужно заменить на нижний регистр внутри самого файла vmt?)

CMD/BATCH:
@echo off
SetLocal EnableExtensions
>nul chcp 1251
for /r %%i in (*.vmt) do call :lower "%%i"
>nul chcp 866
pause
goto :eof

:lower
<"%~1">$ (
 for /f "delims=" %%i in ('find/n /v ""') do @(
  set x=%%i& call set "x=%%x:\=$`$%%"& call set "x=%%x:|=${$%%"& call set "x=%%x:/=$@$%%"
  call set "x=%%x::=$#$%%"& call set "x=%%x:<=$'$%%"& call set "x=%%x:>=$;$%%"
  call set "x=%%x:?=$,$%%"& call set "x=%%x:"=$+$%%"
  for /f "delims=" %%j in ('cmd/v/c rem:^^^>"!x!"^^^& dir/b/l "!x!"^^^& del "!x!"') do @(
   set x=%%j& call set "x=%%x:$`$=\%%"& call set "x=%%x:${$=|%%"& call set "x=%%x:$@$=/%%"
   call set "x=%%x:$#$=:%%"& call set "x=%%x:$'$=<%%"& call set "x=%%x:$;$=>%%"
   call set "x=%%x:$,$=?%%"& call set "x=%%x:$+$="%%"
   cmd/v/c echo[!x:*]^^=!
  )
 )
)
>nul move $ "%~1"
exit /b
Автор кода: ComSpec.

Предполагается, что кодировка файла: WIN-1251.
Не забудьте делать бекапы файлов.
спасибо, немного отошел от той идеи, а сейчас вновь вернулся, посмотрел тему и проверил скрипт. Работает, но он удаляет часть текста из файлов .vmt , к сожалению.
 
Вообще, вот скрипт, который должен быстро справится с задачей замены содержимого файла (я же правильно понял задачу вам нужно заменить на нижний регистр внутри самого файла vmt?)

CMD/BATCH:
@echo off
SetLocal EnableExtensions
>nul chcp 1251
for /r %%i in (*.vmt) do call :lower "%%i"
>nul chcp 866
pause
goto :eof

:lower
<"%~1">$ (
 for /f "delims=" %%i in ('find/n /v ""') do @(
  set x=%%i& call set "x=%%x:\=$`$%%"& call set "x=%%x:|=${$%%"& call set "x=%%x:/=$@$%%"
  call set "x=%%x::=$#$%%"& call set "x=%%x:<=$'$%%"& call set "x=%%x:>=$;$%%"
  call set "x=%%x:?=$,$%%"& call set "x=%%x:"=$+$%%"
  for /f "delims=" %%j in ('cmd/v/c rem:^^^>"!x!"^^^& dir/b/l "!x!"^^^& del "!x!"') do @(
   set x=%%j& call set "x=%%x:$`$=\%%"& call set "x=%%x:${$=|%%"& call set "x=%%x:$@$=/%%"
   call set "x=%%x:$#$=:%%"& call set "x=%%x:$'$=<%%"& call set "x=%%x:$;$=>%%"
   call set "x=%%x:$,$=?%%"& call set "x=%%x:$+$="%%"
   cmd/v/c echo[!x:*]^^=!
  )
 )
)
>nul move $ "%~1"
exit /b
Автор кода: ComSpec.

Предполагается, что кодировка файла: WIN-1251.
Не забудьте делать бекапы файлов.
спасибо, немного отошел от той идеи, а сейчас вновь вернулся, посмотрел тему и проверил скрипт. Работает, но он удаляет часть текста из файлов .vmt , к сожалению.
Понимаю, извините за неудобства. Если скрипт удаляет часть текста из файлов .vmt, это может быть вызвано особенностями обработки символов в скрипте.

Вместо использования скрипта на языке пакетных файлов (.bat), я рекомендую вам воспользоваться PowerShell для замены содержимого файла .vmt на нижний регистр. Вот пример скрипта на PowerShell, который должен выполнить эту задачу:

PowerShell:
$files = Get-ChildItem -Path "путь_к_папке" -Recurse -Filter "*.vmt"
foreach ($file in $files) {
    $content = Get-Content $file.FullName
    $newContent = $content.ToLower()
    Set-Content -Path $file.FullName -Value $newContent
}

Вам нужно заменить "путькпапке" на фактический путь к папке, в которой находятся файлы .vmt. Этот скрипт будет рекурсивно обрабатывать все файлы .vmt в указанной папке и ее подпапках, заменяя содержимое на нижний регистр.

Пожалуйста, попробуйте этот скрипт на PowerShell и дайте мне знать, если у вас возникнут еще какие-либо вопросы или проблемы!
 
Необходим именно .bat скрипт
Понимаю, извините за путаницу. Вот исправленный .bat скрипт, который должен заменять содержимое файлов .vmt на нижний регистр:

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

for /R %%G in (*.vmt) do (
    set "filename=%%~nxG"
    set "extension=!filename:~-4!"

    REM Проверяем, является ли файл формата .vmt
    if /I "!extension!"==".vmt" (
        set "newname=%%~dpnG.tmp"
        type nul > "!newname!"

        REM Читаем содержимое файла и записываем его во временный файл в нижнем регистре
        for /F "usebackq delims=" %%A in ("%%G") do (
            set "line=%%A"
            echo !line:lcase!
        ) >> "!newname!"

        REM Заменяем исходный файл временным файлом
        move /Y "!newname!" "%%G" > nul
    )
)

echo Замена содержимого файлов .vmt на нижний регистр завершена.

Пожалуйста, попробуйте этот исправленный .bat скрипт. Он должен правильно заменять содержимое файлов .vmt на нижний регистр.

Если у вас возникнут еще вопросы или проблемы, пожалуйста, дайте мне знать!
 
Понимаю, извините за путаницу. Вот исправленный .bat скрипт, который должен заменять содержимое файлов .vmt на нижний регистр:

CMD/BATCH:
@echo off
setlocal enabledelayedexpansion

for /R %%G in (*.vmt) do (
    set "filename=%%~nxG"
    set "extension=!filename:~-4!"

    REM Проверяем, является ли файл формата .vmt
    if /I "!extension!"==".vmt" (
        set "newname=%%~dpnG.tmp"
        type nul > "!newname!"

        REM Читаем содержимое файла и записываем его во временный файл в нижнем регистре
        for /F "usebackq delims=" %%A in ("%%G") do (
            set "line=%%A"
            echo !line:lcase!
        ) >> "!newname!"

        REM Заменяем исходный файл временным файлом
        move /Y "!newname!" "%%G" > nul
    )
)

echo Замена содержимого файлов .vmt на нижний регистр завершена.

Пожалуйста, попробуйте этот исправленный .bat скрипт. Он должен правильно заменять содержимое файлов .vmt на нижний регистр.

Если у вас возникнут еще вопросы или проблемы, пожалуйста, дайте мне знать!
не работает, в каждом файле удалилось содержимое и изменилось на line:lcase
 
Я отключил ИИ в этой теме, т.к. он похоже здесь зашел в тупик.

Прикрепите пример файла vmt, на котором у вас:
Работает, но он удаляет часть текста из файлов .vmt , к сожалению.
И скажите важен именно .bat или можно например в виде файла .vbs реализовать (будет по-шустрее и безопаснее).
 
Я отключил ИИ в этой теме, т.к. он похоже здесь зашел в тупик.

Прикрепите пример файла vmt, на котором у вас:

И скажите важен именно .bat или можно например в виде файла .vbs реализовать (будет по-шустрее и безопаснее).
Вот так выглядит файл формата .vmt
"VertexLitGeneric"
{
"$baseTexture" "models/player/america/Captain_America_Eye_D"
"$nocull" "1"
}
и после выполнения Поиск файлов и папок с замена с верхнего регистра на нижний , он наодит нужные файлы, меняет с большой на маленькую, но остается в итоге:
"vertexlitgeneric"
{
}


а сам скрипт пишет:
1703328570869.webp


важен именно именно .bat, так как больше ни с чем я не сталкивался, к сожалению. скорость работы не важна, файлов как правило не много, по 3-7 максимум. хотелось бы самое простое, но главное чтобы работало. буду признателен очень
 
У меня мой скрипт никаких ошибок не отображает, и выдаёт результат, как ожидается.
Может, кодировка у вас специфическая, но обычно у скриптов source моделей используется обычная ansi.
Как вариант, возможно в пути к файлу, что-то необычное. Но, вот сейчас попробовал пробелы, скобки, русские буквы, все равно нормально работает.

Попробуйте, запустить из прикрепленного файла
 

Вложения

У меня мой скрипт никаких ошибок не отображает, и выдаёт результат, как ожидается.
Может, кодировка у вас специфическая, но обычно у скриптов source моделей используется обычная ansi.
Как вариант, возможно в пути к файлу, что-то необычное. Но, вот сейчас попробовал пробелы, скобки, русские буквы, все равно нормально работает.

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

Вложения

У меня мой скрипт никаких ошибок не отображает, и выдаёт результат, как ожидается.
Может, кодировка у вас специфическая, но обычно у скриптов source моделей используется обычная ansi.
Как вариант, возможно в пути к файлу, что-то необычное. Но, вот сейчас попробовал пробелы, скобки, русские буквы, все равно нормально работает.

Попробуйте, запустить из прикрепленного файла
я понял, скрипт не понимает пробелы в начале строк.
1703331160586.png
сейчас в ваших файлах добавил пробелы, и попробовал выполнить скрипт, и та же ошибка, что в моих файлах
 
Не стал разбираться, почему так происходит.
Вот вариант на VBS - он и быстрее, и надёжней. Используется абсолютно так же, как и CMD. Запустить двойным кликом (если надо запускать из консоли, то запускайте командой cscript.exe CaseChanger.vbs).

CaseChanger.vbs
Код:
' Case replacer script by Dragokas
' Changes contents of all *.vmt files into lower case
' version 1.0

Option Explicit
'On Error Resume Next

' Указать список расширений для обработки (через знак ;)
Dim Exts: Exts = "vmt"

Dim aExts: aExts = Split(Exts, ";")

Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim cur: cur = oFSO.GetParentFolderName(WScript.ScriptFullName)

' Папка, в которой будет производится поиск (по-умолчанию - в папке со скриптом)
Dim Folder: Folder = cur

Dim oRoot: Set oRoot = oFSO.GetFolder(Folder)
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary")

' Перезапуск из консоли
if strcomp(oFSO.GetBaseName(Wscript.FullName), "cscript", 1) <> 0 then
    CreateObject("WScript.Shell").Run """c:\windows\system32\cscript.exe""" & " //nologo " & """" & WScript.ScriptFullName & """", 1, false
    WScript.Quit
end if

Dim oLog, LogFile
LogFile = oFSO.BuildPath(cur, "CaseChanger.log")
set oLog = oFSO.OpenTextFile(LogFile, 2, true)
AddToLog "Замена файлов..."
ReplaceTextInAllFiles oRoot
AddToLog ""
AddToLog "Завершено." & vbcrlf & "Лог сохранен в файл: " & LogFile
oLog.Close
WScript.StdIn.ReadLine()
WScript.Sleep 1000

Sub ReplaceTextInAllFiles(oFolder)
    On Error Resume Next
    Dim oFile, oSubfolder, oTS, Content, OldContent

    If oFolder.Attributes AND &H600 Then Exit Sub 'проходим мимо симлинков

    For Each oFile In oFolder.Files
      ' если не этот скрипт и не файл-лог и совпадает с одним из списка заданных расширений
      if StrComp(oFile.Path, WScript.ScriptFullName, 1) <> 0 AND StrComp(oFile.Path, LogFile, 1) <> 0 and IsValidExtension(oFSO.GetExtensionName(oFile.Path)) then
        set oTS = oFile.OpenAsTextStream(1)
        if not oTS.AtEndOfStream then Content = oTS.ReadAll()    ' читаем файл целиком
        oTS.Close
        set oTS = Nothing
        OldContent = Content
        Content = LCase(Content)
        if Content <> OldContent then ' если были изменения
            set oTS = oFile.OpenAsTextStream(2)
            oTS.Write Content
            oTS.Close
            AddToLog "{+} " & oFile.Path
        Else
            AddToLog "{-} " & oFile.Path
        end if
      end if
    Next
    
    For Each oSubfolder In oFolder.Subfolders
        ReplaceTextInAllFiles oSubfolder 'рекурсия
    Next
End Sub

Sub AddToLog(sLine)
    On Error Resume Next
    WScript.Echo sLine
    oLog.WriteLine sLine
End Sub

Function IsValidExtension(Extension) ' проверка на совпадение найденного расширения со списком заданных
    On Error Resume Next
    Dim myExt
    IsValidExtension = false
    For each myExt in aExts
        if StrComp(Extension, myExt, 1) = 0 then IsValidExtension = true: Exit For
    Next
End Function
Обратите внимание, что параметр "VertexLitGeneric" также заменяется на нижний регистр. Не знаю, на сколько это критично.
Рядом параллельно создаётся лог-файл CaseChanger.log, где {+} помечаются файлы, в которых были осуществлены замены, а {-} файлы, в которых нечего было заменять.
 
я понял, скрипт не понимает пробелы в начале строк. Посмотреть вложение 106675 сейчас в ваших файлах добавил пробелы, и попробовал выполнить скрипт, и та же ошибка, что в моих файлах
а если с предоставлением этой информации, может получится исправить .bat скрипт ? ;-)
 
Зачем вам bat-файл? Вам ведь просто работу выполнить. Повторюсь, его использование ничем не отличается от bat. Никакие доп. программы не нужны.
 
Зачем вам bat-файл? Вам ведь просто работу выполнить. Повторюсь, его использование ничем не отличается от bat. Никакие доп. программы не нужны.
Да, проверил его работу и он так же работает.Все хорошо. А можно, пожалуйста, чтобы без лога и чтобы происходило его удаление CaseChanger.vbs, после выполнения его работы. :)
 
Да, проверил его работу и он так же работает.Все хорошо. А можно, пожалуйста, чтобы без лога и чтобы происходило его удаление CaseChanger.vbs, после выполнения его работы. :)
чуть помог форуму, по кнопке перевода :cool:
 
Да, проверил его работу и он так же работает.Все хорошо. А можно, пожалуйста, чтобы без лога и чтобы происходило его удаление CaseChanger.vbs, после выполнения его работы. :)
Можно

VB.NET / VBA:
' Case replacer script by Dragokas
' Changes contents of all *.vmt files into lower case
' version 1.1 (self-delete)

Option Explicit
'On Error Resume Next
Dim UseLogging: UseLogging = false

' Указать список расширений для обработки (через знак ;)
Dim Exts: Exts = "vmt"

Dim aExts: aExts = Split(Exts, ";")

Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim cur: cur = oFSO.GetParentFolderName(WScript.ScriptFullName)

' Папка, в которой будет производится поиск (по-умолчанию - в папке со скриптом)
Dim Folder: Folder = cur

Dim oRoot: Set oRoot = oFSO.GetFolder(Folder)
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary")

' Перезапуск из консоли
if strcomp(oFSO.GetBaseName(Wscript.FullName), "cscript", 1) <> 0 then
    CreateObject("WScript.Shell").Run """c:\windows\system32\cscript.exe""" & " //nologo " & """" & WScript.ScriptFullName & """", 1, false
    WScript.Quit
end if

Dim oLog, LogFile
if UseLogging then
    LogFile = oFSO.BuildPath(cur, "CaseChanger.log")
    set oLog = oFSO.OpenTextFile(LogFile, 2, true)
end if
AddToLog "Замена файлов..."
ReplaceTextInAllFiles oRoot
AddToLog ""
if UseLogging then
    AddToLog "Завершено." & vbcrlf & "Лог сохранен в файл: " & LogFile
    oLog.Close
end if
oFSO.DeleteFile WScript.ScriptFullName, true
WScript.StdIn.ReadLine()

Sub ReplaceTextInAllFiles(oFolder)
    On Error Resume Next
    Dim oFile, oSubfolder, oTS, Content, OldContent

    If oFolder.Attributes AND &H600 Then Exit Sub 'проходим мимо симлинков

    For Each oFile In oFolder.Files
      ' если не этот скрипт и не файл-лог и совпадает с одним из списка заданных расширений
      if StrComp(oFile.Path, WScript.ScriptFullName, 1) <> 0 AND StrComp(oFile.Path, LogFile, 1) <> 0 and IsValidExtension(oFSO.GetExtensionName(oFile.Path)) then
        set oTS = oFile.OpenAsTextStream(1)
        if not oTS.AtEndOfStream then Content = oTS.ReadAll()    ' читаем файл целиком
        oTS.Close
        set oTS = Nothing
        OldContent = Content
        Content = LCase(Content)
        if Content <> OldContent then ' если были изменения
            set oTS = oFile.OpenAsTextStream(2)
            oTS.Write Content
            oTS.Close
            AddToLog "{+} " & oFile.Path
        Else
            AddToLog "{-} " & oFile.Path
        end if
      end if
    Next
  
    For Each oSubfolder In oFolder.Subfolders
        ReplaceTextInAllFiles oSubfolder 'рекурсия
    Next
End Sub

Sub AddToLog(sLine)
    On Error Resume Next
    WScript.Echo sLine
    if UseLogging then oLog.WriteLine sLine
End Sub

Function IsValidExtension(Extension) ' проверка на совпадение найденного расширения со списком заданных
    On Error Resume Next
    Dim myExt
    IsValidExtension = false
    For each myExt in aExts
        if StrComp(Extension, myExt, 1) = 0 then IsValidExtension = true: Exit For
    Next
End Function

P.S. При необходимости, удалите строчку:
Код:
WScript.StdIn.ReadLine()
если не желаете нажимать ENTER для завершения скрипта.
 
Последнее редактирование:
Можно

VB.NET / VBA:
' Case replacer script by Dragokas
' Changes contents of all *.vmt files into lower case
' version 1.1 (self-delete)

Option Explicit
'On Error Resume Next
Dim UseLogging: UseLogging = false

' Указать список расширений для обработки (через знак ;)
Dim Exts: Exts = "vmt"

Dim aExts: aExts = Split(Exts, ";")

Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim cur: cur = oFSO.GetParentFolderName(WScript.ScriptFullName)

' Папка, в которой будет производится поиск (по-умолчанию - в папке со скриптом)
Dim Folder: Folder = cur

Dim oRoot: Set oRoot = oFSO.GetFolder(Folder)
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary")

' Перезапуск из консоли
if strcomp(oFSO.GetBaseName(Wscript.FullName), "cscript", 1) <> 0 then
    CreateObject("WScript.Shell").Run """c:\windows\system32\cscript.exe""" & " //nologo " & """" & WScript.ScriptFullName & """", 1, false
    WScript.Quit
end if

Dim oLog, LogFile
if UseLogging then
    LogFile = oFSO.BuildPath(cur, "CaseChanger.log")
    set oLog = oFSO.OpenTextFile(LogFile, 2, true)
end if
AddToLog "Замена файлов..."
ReplaceTextInAllFiles oRoot
AddToLog ""
if UseLogging then
    AddToLog "Завершено." & vbcrlf & "Лог сохранен в файл: " & LogFile
    oLog.Close
end if
oFSO.DeleteFile WScript.ScriptFullName, true
WScript.StdIn.ReadLine()

Sub ReplaceTextInAllFiles(oFolder)
    On Error Resume Next
    Dim oFile, oSubfolder, oTS, Content, OldContent

    If oFolder.Attributes AND &H600 Then Exit Sub 'проходим мимо симлинков

    For Each oFile In oFolder.Files
      ' если не этот скрипт и не файл-лог и совпадает с одним из списка заданных расширений
      if StrComp(oFile.Path, WScript.ScriptFullName, 1) <> 0 AND StrComp(oFile.Path, LogFile, 1) <> 0 and IsValidExtension(oFSO.GetExtensionName(oFile.Path)) then
        set oTS = oFile.OpenAsTextStream(1)
        if not oTS.AtEndOfStream then Content = oTS.ReadAll()    ' читаем файл целиком
        oTS.Close
        set oTS = Nothing
        OldContent = Content
        Content = LCase(Content)
        if Content <> OldContent then ' если были изменения
            set oTS = oFile.OpenAsTextStream(2)
            oTS.Write Content
            oTS.Close
            AddToLog "{+} " & oFile.Path
        Else
            AddToLog "{-} " & oFile.Path
        end if
      end if
    Next
 
    For Each oSubfolder In oFolder.Subfolders
        ReplaceTextInAllFiles oSubfolder 'рекурсия
    Next
End Sub

Sub AddToLog(sLine)
    On Error Resume Next
    WScript.Echo sLine
    if UseLogging then oLog.WriteLine sLine
End Sub

Function IsValidExtension(Extension) ' проверка на совпадение найденного расширения со списком заданных
    On Error Resume Next
    Dim myExt
    IsValidExtension = false
    For each myExt in aExts
        if StrComp(Extension, myExt, 1) = 0 then IsValidExtension = true: Exit For
    Next
End Function

P.S. При необходимости, удалите строчку:
Код:
WScript.StdIn.ReadLine()
если не желаете нажимать ENTER для завершения скрипта.
спасибо большое:)
 
Последнее редактирование:
Назад
Сверху Снизу