Powershell para encontrar valor e criar arquivo

Powershell para encontrar valor e criar arquivo

Eu sou novo no PowerShell, esperava alguma ajuda. Estou procurando um comando do PowerShell que pesquise um arquivo, encontre uma string e crie um arquivo com base no valor da string encontrado.

O arquivo "abc.txt" contém uma frase de palavras semelhante a esta,Conectado em app\prog01. Mas algumas vezes este arquivo "abc.txt" terá programas e números diferentes, como prog21 ou prog58.

Quando o comando for executado, se o abc.txt tiverConectado em app\prog58nele, criará um arquivo simples chamado prog58 sem extensão.

Responder1

Você precisa do Select-Stringcmdlet, que por padrão tem o alias de sls. Este cmdlet permite corresponder uma expressão regular e, em seguida, extrair a cadeia de caracteres correspondente. O comando completo é mais ou menos assim:

$(sls 'Logged into app\\prog[0-9]+' 'abc.txt' -all).matches | foreach { $fn=$_.value.split('\\')[1]; [System.IO.File]::Create($fn).close(); $fn }

Basicamente, para cada instância da string Logged into app\\progX(onde X é um ou mais dígitos) que encontra no arquivo, ele pega o material à direita do \até chegar ao final dos dígitos, cria um arquivo com esse nome, fecha o arquivo sem gravá-lo e ecoa esse nome no stdout (você pode remover a última parte, se desejar).

Responder2

Eu sei que você pediu um comando do PowerShell, mas o que estou prestes a oferecer pode ser suficiente.

Ele funcionará em um shell Cmd.exe padrão, o que significa que você também pode executá-lo no PowerShell e será compatível com versões anteriores de sistemas operacionais Windows mais antigos:

TYPE abc.txt | FIND "Logged into app\prog58" >NUL && IF NOT DEFINED %ERRORLEVEL% (TYPE NUL >prog58)

Posso estar entendendo mal a pergunta, no entanto. Você poderia esclarecer se é exatamente isso que você está procurando ou se deseja criar um arquivo com o nome progXXbaseado em qualquer texto existente em abc.txt?

Editar após esclarecimento: O seguinte também é compatível com Cmd.exe e não exclusivo do PowerShell, portanto, embora não possa ser usado como uma linha, pode ser chamado como um script em lote simples:

@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%

Advertência: isso depende de progXXter exatamente 2 dígitos, portanto progXXXnão funcionaria.

informação relacionada