Это легко достижимая задача с использованием JREPL.BAT , написанного Дейвом Бенхамом , который представляет собой гибрид пакетного файла / JScript для выполнения замены регулярного выражения в файле с использованием JScript. .
@echo off
if not exist "%~dp0jrepl.bat" (
echo ERROR: JREPL.BAT missing in directory "%~dp0".
echo/
pause
goto :EOF
)
for %%I in ("C:\Temp\*.txt") do call "%~dp0jrepl.bat" "^((?:new)?location000:/.+/).*(\.[^.,]+,)" "$1%%~nI$2" /F "%%I" /O -
Этот пакетный файл работает только на дисках NTFS. Это может привести к бесконечному циклу выполнения на дисках FAT16, FAT32 или ExFAT или пропуску некоторых текстовых файлов. Для рабочего решения, независимого от файловой системы, замените последнюю командную строку на:
for /F "eol=| delims=" %%I in ('dir "C:\Temp\*.txt" /A-D-H /B /ON 2^>nul') do call "%~dp0jrepl.bat" "^((?:new)?location000:/.+/).*(\.[^.,]+,)" "$1%%~nI$2" /F "C:\Temp\%%I" /O -
Пакетный файл JREPL.BAT должен храниться в том же каталоге, что и пакетный файл с кодом выше. По этой причине пакетный файл сначала проверяет, действительно ли JREPL.BAT существует в каталоге пакетного файла, и, если это не так, выдает сообщение об ошибке, останавливает выполнение скрипта, чтобы пользователь мог прочитайте это сообщение об ошибке и затем выйдите. См. Куда возвращается GOTO: EOF?
Команда FOR ищет в указанном каталоге C:\Temp
нескрытые файлы, соответствующие шаблону подстановки *.txt
, и вызывает для каждого найденного текстового файла пакетный файл JREPL.BAT для замените имя файла между last /
и first строкой, начинающейся с .
, с одним или несколькими символами, не являющимися точкой или запятой, со следующим символом, являющимся ,
(= расширение файла и запятая) в строках, начинающихся с чувствительности к регистру location000:/
или newlocation000:/
по имени текущего файла * .txt без расширения файла. Таким образом, имя файла в существующем файле может содержать также один или несколько .
в имени файла перед расширением файла.
Решение, работающее также на дисках FAT, использует команду DIR для получения захваченного списка * .txt файлов с просто именем файла и расширением файла без пути и FOR обрабатывает этот список имен файлов построчно, т.е. имя файла по имени файла. Таким образом, список * .txt файлов для обработки не изменяется при запуске FOR , вызывающем JREPL.BAT , как это было бы в случае использования FOR непосредственно для поиска файлы * .txt на дисках FAT.
NTFS возвращает список записей каталога, соответствующих шаблону подстановочного знака, отсортированному в алфавитном порядке, поэтому список файлов * .txt не изменяется во время итераций FOR в этом случае. Но все файловые системы FAT возвращают список записей каталога, соответствующих шаблону с подстановочными знаками, в соответствии с последней модификацией в каталоге с последним измененным файлом в конце списка. Таким образом, в то время как FOR получает одно имя файла за другим при использовании for %%I in ("C:\Temp\*.txt") do
из файловой системы и обрабатывает файл с вызовом jrepl.bat
, который изменяет файл, список файлов изменяется на дисках FAT и возвращается следующая запись каталога в FOR при поиске *.txt
это либо только что измененный файл (= бесконечный цикл), либо другой файл после пропуска файла, который также должен быть изменен из-за изменения списка файлов с момента последнего доступа к каталогу FOR .
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
call /?
... объясняет также %~dp0
... диск и путь аргумента 0, являющийся самим пакетным файлом.
dir /?
echo /?
for /?
goto /?
if /?
pause /?
jrepl.bat /?