
Я новичок в powershell, надеялся на помощь. Я ищу команду powershell, которая будет искать в файле, находить строку и создавать файл на основе найденного значения строки.
Файл «abc.txt» содержит предложение, которое выглядит следующим образом:Выполнен вход в app\prog01. Но иногда этот файл "abc.txt" будет иметь другую программу и номер, например prog21 или prog58.
При запуске команды, если abc.txt имеетВыполнен вход в приложение\prog58в нем будет создан файл с простым именем prog58 без расширения.
решение1
Вам нужен Select-String
командлет, который по умолчанию имеет псевдоним sls
. Этот командлет позволяет вам сопоставить регулярное выражение, а затем извлечь совпавшую строку. Полная команда выглядит примерно так:
$(sls 'Logged into app\\prog[0-9]+' 'abc.txt' -all).matches | foreach { $fn=$_.value.split('\\')[1]; [System.IO.File]::Create($fn).close(); $fn }
По сути, для каждого экземпляра строки Logged into app\\progX
(где X — одна или несколько цифр), который он находит в файле, он берет содержимое справа от , \
пока не достигнет конца цифр, создает файл с этим именем, закрывает файл без записи в него и выводит это имя в stdout (при желании можно удалить последнюю часть).
решение2
Я знаю, что вы просили команду PowerShell, но то, что я собираюсь предложить, может оказаться достаточным.
Он будет работать в стандартной оболочке Cmd.exe, то есть вы также сможете запустить его в PowerShell, и он будет обратно совместим со старыми операционными системами Windows:
TYPE abc.txt | FIND "Logged into app\prog58" >NUL && IF NOT DEFINED %ERRORLEVEL% (TYPE NUL >prog58)
Хотя я могу неправильно понять вопрос. Не могли бы вы уточнить, это именно то, что вы ищете, или вы хотите создать файл с именем progXX
на основе текста, существующего в abc.txt?
Редактировать после уточнения: Следующий код также совместим с Cmd.exe и не предназначен исключительно для PowerShell, поэтому, хотя его нельзя использовать как однострочный сценарий, его можно вызвать как простой пакетный скрипт:
@ECHO OFF
SETLOCAL && SETLOCAL EnableExtensions EnableDelayedExpansion
FOR /F "tokens=1-2 delims=\" %%A IN ('TYPE abc.txt ^| FINDSTR /C:"Logged into app\prog"') DO (SET FILENAME=%%B)
SET FILENAME=%FILENAME:~0,6%
TYPE NUL >%FILENAME%
Предупреждение: здесь необходимо progXX
иметь ровно 2 цифры, поэтому этот progXXX
вариант не сработает.