
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-String
cmdlet, 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 progXX
baseado 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 progXX
ter exatamente 2 dígitos, portanto progXXX
não funcionaria.