Solicitud de entrada de Powershell

Tengo algunas líneas de código de PowerShell que buscan en un directorio remoto

Get-ChildItem "\\box_lab001\f$\output files" -force | 
    Where-Object {!$_.PsIsContainer -AND $_.lastWriteTime -lt (Get-Date).AddMinutes(-5) } | 
    Select-Object LastWriteTime,@{n="Path";e={convert-path $_.PSPath}} | 
    Tee-Object "\\\box_lab001\c$\Users\john\Documents\output files_root.txt" | 
    Remove-Item -force

Lo que busco hacer es hacer que esto sea escalable en varios cuadros donde si un usuario ve un problema en box_lab01, a través de 10. Luego puede ejecutar el script con un interruptor que le pedirá entrada. Luego ejecutaría el comando por separado, reemplazando box_lab### cada vez, ¿es posible?

C:\powershell.ps1 -input what boxes are having the issue? use three digit numbers only, comma separated

preguntado el 12 de junio de 12 a las 16:06

2 Respuestas

Desea agregar un parámetro que tome una matriz de valores como entrada. Luego puede usarlos para verificar cada máquina:

[CmdletBinding()]
param(
    [int[]]
    # The numbers of the machines whose output files should be removed.
    $MachineNumbers
)

$MachineNumbers | ForEach-Object {
    $machineRoot = '\\box_lab{0:d3}' -f $_ 
    Get-ChildItem ('{0}\f$\output files' -f $machineRoot) -force | 
        Where-Object {!$_.PsIsContainer -AND $_.lastWriteTime -lt (Get-Date).AddMinutes(-5) } | 
        Select-Object LastWriteTime,@{n="Path";e={convert-path $_.PSPath}} | 
        Tee-Object ('{0}\c$\Users\john\Documents\output files_root.txt' -f $machineRoot)  | 
        Remove-Item -force

El código ('\\box_lab{{0:d3}}' -f $_) convierte cada número pasado por el usuario en una cadena de tres caracteres con ceros (que parece ser el esquema de nomenclatura de su computadora). Entonces llamarías a tu script así:

 Remove-OutputFiles -MachineNumbers (1..10)
 Remove-OutputFiles -MachineNumbers 1,2,3,4,5

Podrías dar el MachineNumbers parámetro un valor predeterminado razonable, de modo que si no se pasan parámetros, llega a un conjunto predeterminado de máquinas.

Yo también usaría el [CmdletBinding()] atribuye a tu script para que puedas pasar -WhatIf a su secuencia de comandos y vea qué archivos se eliminarán sin eliminarlos realmente:

Remove-OutputFiles -MachineNumbers (1..3) -WhatIf

Respondido el 12 de junio de 12 a las 20:06

Sí, es compatible.

Puedes usar el Read-Host para solicitar una entrada. Puedes usar param(...) para agregar parámetros a un script:

param($input = $null)
if ($input) {
    $foo = Read-Host -Prompt $input
}

A continuación, puede obtener los números individuales utilizando -split:

$numbers = $foo -split ','

Bucle sobre ellos:

$numbers | ForEach-Object {
  ...
}

Puedes usar el $_ dentro del bloque para hacer referencia al número actual.

Respondido el 12 de junio de 12 a las 19:06

y luego algún tipo de bucle for para que recorra el script una vez con cada parámetro? - tony

Creo que es mejor leer primero la documentación. Es realmente bueno para PowerShell. - Joey

alguna otra pista que me puedas dar? buscando hacer esto hoy. - tony

Lo descubrí hasta el punto en que hago que el usuario ingrese los valores de tres dígitos separados por una coma y haga que se imprima como una lista. ¿Ahora no sé cómo decirle que se sustituya en cada uno de esos valores en mi código? - tony

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