Как искать строку в файле? - PullRequest
0 голосов
/ 27 апреля 2018

Я пишу командный файл для чтения всех файлов в папке.

Ниже мой код:

@echo off
setlocal EnableDelayedExpansion 
for %%I in (C:\test\*.print_job.*) do (
   Set Name=%%~nxI
   echo !Name!
)
pause

Я могу получить все файлы .print_job, но теперь я хочу прочитать все файлы и найти определенный идентификатор.

  • если файл содержит «MOUNT», переместите этот файл в C: \ Folder1
  • если файл содержит «PROD», то файл должен быть перемещен в C: \ Folder2
  • если файл содержит «SPI», то файл должен быть перемещен в C: \ folder3

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018
@echo off
rem             string  target                  destination
call :movefiles "MOUNT" "C:\test\*.print_job.*" "C:\Folder1"
call :movefiles "PROD"  "C:\test\*.print_job.*" "C:\Folder2"
call :movefiles "SPI"   "C:\test\*.print_job.*" "C:\Folder3"
goto :eof

:movefiles
if not exist "%~3" md "%~3"
for /f "delims=" %%A in ('2^>nul findstr /l /m /c:"%~1" "%~2"') do (
    move "%%~A" "%~3"
)
goto :eof

Использование call :movefiles для обработки каждой из 3 строк искать в целевых файлах.

Синтаксис вызова: call :movefiles <string> <target> <destination>

Делает каталог назначения, если он не существует. Если строка найдена в целевом файле, файл будет перемещен в место назначения папка.

Используются findstr аргументы:

  • /l Буквально использует строки поиска.
  • /m Печатает только имя файла, если файл содержит совпадение.
  • /c:string Использует указанную строку в качестве буквенной строки поиска.

Вы можете вставить rd "%~3" после цикла for, если хотите удалить пустые папки назначения.


Зацикливание каждые 2 секунды:

@echo off
:main
rem             string  target                  destination
call :movefiles "MOUNT" "C:\test\*.print_job.*" "C:\Folder1"
call :movefiles "PROD"  "C:\test\*.print_job.*" "C:\Folder2"
call :movefiles "SPI"   "C:\test\*.print_job.*" "C:\Folder3"
timeout /t 2 /nobreak >nul
goto :main

:movefiles
if not exist "%~3" md "%~3"
for /f "delims=" %%A in ('2^>nul findstr /l /m /c:"%~1" "%~2"') do (
    echo move "%%~A" "%~3"
)
goto :eof

Возможно, вам придется использовать Ctrl + C , чтобы завершить сценарий в непрерывном цикле.

Если вместо этого вы можете использовать планировщик задач, это может сработать.

0 голосов
/ 27 апреля 2018

Если имя файла с удаленным поисковым словом отличается, оно было там.

@echo off
for %%I in (C:\test\*) do Call :Sub "%%I"
Pause
Goto :Eof
:Sub
Set "Name=%~nx1"
if "%Name%" neq "%Name:MOUNT=%" (move "%~1" "C:\Folder1\" & Goto :Eof)
if "%Name%" neq "%Name:PROD=%"  (move "%~1" "C:\Folder2\" & Goto :Eof)
if "%Name%" neq "%Name:SPI=%"   (move "%~1" "C:\Folder3\" & Goto :Eof)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...