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

Файл "abc.txt" содержит предложение слов, которое выглядит следующим образом: Зайдите в app\prog01. Но иногда этот файл "abc.txt" будет иметь различную прогу и номер, например, prog21 или prog58.

Когда команда запускается, если в файле abc.txt зашли в app\prog58 , она создаст простой файл с именем prog58 без расширения.

2 ответа2

0

Я знаю, что вы просили команду 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 не будет работать.

0

Вам нужен командлет 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 - одна или несколько цифр), который он находит в файле, он переносит содержимое справа от \ пока не достигнет конца цифр, создает файл с таким именем, закрывает файл без записи в него и выводит это имя на стандартный вывод (вы можете удалить последнюю часть, если хотите).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .