Leer múltiples valores de un archivo de texto en powershell y luego manipular los valores

Perdone la pregunta de principiante, soy nuevo en powershell y estoy tratando de hacer algo que debería ser muy fácil.

tengo un archivo de texto con los siguientes contenidos

DEVICE ID:   {E24CF707-F030-48DC-8E1A-59B96148BF52}
DEVICE NAME: All Devices (RAINBOW-SRV)
TYPE:        Drive pool
DEVICE ID:   {D16DC75F-8A8B-4AEC-A411-9B0BC58CBF16}
DEVICE NAME: HP 1
TYPE:        Drive
DEVICE ID:   {F2D2AB4A-1FBE-4158-AB62-6A94AE4392E2}
DEVICE NAME: RAINBOW-SRV
TYPE:        Machine
DEVICE ID:   {23AD5D42-00A8-496B-96E5-1F5CAA3F9E9D}
DEVICE NAME: Symantec Protection Network (RAINBOW-SRV)
TYPE:        Symantec Protection Network
RETURN VALUE: 1

Estoy tratando de obtener la cadena que sigue al NOMBRE DEL DISPOSITIVO: en cada ocurrencia en una matriz para pasar a un comando más adelante en la línea. Probé el siguiente código pero aparece un error que indica que Substring no es un método válido.

¡Siento que me estoy perdiendo algo muy obvio pero no puedo verlo! cualquier ayuda sería muy apreciada.

Muchas Gracias

preguntado el 22 de mayo de 12 a las 14:05

¿Creo que olvidaste pegar tu código? -

3 Respuestas

Lea el contenido del archivo, filtre las líneas que comienzan con 'NOMBRE DEL DISPOSITIVO:', para cada línea elimine (reemplace sin nada) 'NOMBRE DEL DISPOSITIVO:'

Get-Content devices.txt | Where-Object {$_ -like 'DEVICE NAME:* '} | Foreach-Object {$_ -repla
ce '^DEVICE NAME: '}

All Devices (RAINBOW-SRV)
HP 1
RAINBOW-SRV
Symantec Protection Network (RAINBOW-SRV)

ACTUALIZACIÓN: por solicitud de OT, cómo pasar el valor a un comando ejecutable

Get-Content devices.txt | 
Where-Object {$_ -like 'DEVICE NAME:* '} | 
Foreach-Object {
    $device = $_ -replace '^DEVICE NAME: '
    app.exe "$device"
}

contestado el 22 de mayo de 12 a las 15:05

$a = Obtener contenido C:\NetESP\BackupTapeCheck\DriveDetails.txt | Select-String "NOMBRE DEL DISPOSITIVO:" foreach ($línea en $a) {$línea.Subcadena(13)} - steveo448

No funciona porque $line es un objeto MatchInfo y no tiene un método Substring. Debe consultar su propiedad Line: $line.line.Substring(13). También puede convertirlo en cadena de muchas otras formas, como: "$line".Substring(13) o $line.ToString().Substring(13) - shay levy

Gracias Shay, ¡he estado intentando durante más tiempo del que me gustaría admitir para volver a poner eso en una cuerda! - steveo448

Mientras tengo esto abierto, ¿sabe cómo pasaría cada una de estas líneas a un comando ejecutable una a la vez? Supongo que los 4 valores están en una matriz, pero no estoy seguro de cuál sería el nombre. - steveo448

Otra solución:

$list = @((get-content devices.txt) | where { $_ -match "DEVICE NAME:\s*(?<Device>.+)\s*" } | %{ $matches["Device"] })

$list

contestado el 22 de mayo de 12 a las 15:05

Con frecuencia uso este método. - Marceljg

Otra solución más:

Get-Content -Path .\devices.txt |
    Select-String 'DEVICE NAME: ' |
        Foreach-Object {
            $_.ToString() -replace '^DEVICE NAME: ','app.exe '
        }

Respondido 18 Feb 15, 02:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.