Powershell para encontrar valor y crear archivos

Powershell para encontrar valor y crear archivos

Soy nuevo en PowerShell y esperaba ayuda. Estoy buscando un comando de PowerShell que busque en un archivo, encuentre una cadena y cree un archivo basado en el valor de esa cadena que se encuentra.

El archivo "abc.txt" tiene una oración de palabras que se ve así:Ha iniciado sesión en la aplicación\prog01. Pero algunas veces este archivo "abc.txt" tendrá un programa y un número diferentes, como prog21 o prog58.

Cuando se ejecuta el comando, si el abc.txt tieneHa iniciado sesión en la aplicación\prog58en él, creará un archivo simple llamado prog58 sin extensión.

Respuesta1

Necesita el Select-Stringcmdlet, que de forma predeterminada tiene el alias sls. Este cmdlet le permite hacer coincidir una expresión regular y luego extraer la cadena coincidente. El comando completo es algo como esto:

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

Básicamente, para cada instancia de la cadena Logged into app\\progX(donde X es uno o más dígitos) que encuentra en el archivo, toma lo que está a la derecha de \hasta llegar al final de los dígitos, crea un archivo con ese nombre, cierra el archivo sin escribir en él y repite ese nombre en la salida estándar (puede eliminar la última parte si lo desea).

Respuesta2

Sé que solicitó un comando de PowerShell, pero lo que voy a ofrecerle puede ser suficiente.

Funcionará en un shell Cmd.exe estándar, lo que significa que también puede ejecutarlo en PowerShell y será compatible con sistemas operativos Windows más antiguos:

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

Sin embargo, es posible que esté malinterpretando la pregunta. ¿Podría aclarar si esto es exactamente lo que está buscando o si está buscando crear un archivo con el nombre progXXbasado en el texto que existe en abc.txt?

Editar después de la aclaración: Lo siguiente también es compatible con Cmd.exe y no es exclusivo de PowerShell, por lo que, si bien no se puede usar como una sola línea, se puede llamar como un simple script por lotes:

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

Advertencia: esto depende de progXXtener exactamente 2 dígitos, por lo que progXXXno funcionaría.

información relacionada