
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-String
cmdlet, 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 progXX
basado 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 progXX
tener exactamente 2 dígitos, por lo que progXXX
no funcionaría.