Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

178
Vistas
Interruptor de PowerShell ejecutándose de nuevo al salir

Estoy intentando escribir un menú de PowerShell con varios interruptores, pero no puedo entender por qué los comandos ejecutados anteriormente se ejecutarán nuevamente al salir. Cualquier ayuda sería muy apreciada. El código que tengo hasta ahora es el siguiente:

 function Show-Menu { param ( [string]$Title = 'Menu' ) Clear-Host Write-Host "`n============= $Title =============`n" Write-Host "Press 'A' to run all commands" Write-Host "Press '1' to run foo" Write-Host "Press '2' to run bar" Write-Host "Press 'Q' to quit" } do { Show-Menu $Selection = Read-Host "`nPlease make a selection" switch ($Selection) { 'A' { $Actions = @('foo', 'bar') } '1' { $Actions = "foo" } '2' { $Actions = "bar" } } switch ( $Actions ) { 'foo' { Write-Host "foo executed" Start-Sleep -Seconds 2 } 'bar' { Write-Host "bar executed" Start-Sleep -Seconds 2 } } } until ($Selection -eq 'q')
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Simplificar.

En lugar de guardar acciones en una variable y luego dar otro paso para evaluar esa variable... realice las acciones.

En lugar de tener un ciclo que verifique la condición de salida en una ubicación separada (es decir, usando until ), use un ciclo sin fin y una break explícita. Esto ayuda a mantener la lógica en un solo lugar.

 function foo { Write-Host "foo"; Start-Sleep -Seconds 1 } function bar { Write-Host "bar"; Start-Sleep -Seconds 1 } :menuLoop while ($true) { Clear-Host Write-Host "`n============= Menu =============`n" Write-Host "Press 'A' to run all commands" Write-Host "Press '1' to run foo" Write-Host "Press '2' to run bar" Write-Host "Press 'Q' to quit" switch (Read-Host "`nPlease make a selection") { 'A' { foo; bar } '1' { foo } '2' { bar } 'Q' { break menuLoop } } }

Su enfoque no funciona correctamente porque en su código, presionar Q no sale inmediatamente del ciclo, y $Actions todavía se llena desde la última iteración.

Esa es otra lección: los valores de las variables no se restablecen solos en los bucles. Siempre establezca sus variables en $null al comienzo del ciclo para obtener un estado limpio.

Tenga en cuenta la etiqueta :mainLoop . Sin él, break solo se aplicaría a la declaración de switch en sí. Ver MSDN


Dicho esto, PowerShell tiene un sistema de menús bastante ingenioso incorporado que puede usar.

 using namespace System.Management.Automation.Host function foo { Write-Host "foo"; Start-Sleep -Seconds 1 } function bar { Write-Host "bar"; Start-Sleep -Seconds 1 } # set up available choices, and a help text for each of them $choices = @( [ChoiceDescription]::new('run &all commands', 'Will run foo, and then bar') [ChoiceDescription]::new('&1 run foo', 'will run foo only') [ChoiceDescription]::new('&2 run bar', 'will run bar only') [ChoiceDescription]::new('&Quit', 'aborts the program') ) # set up script blocks that correspond to each choice $actions = @( { foo; bar } { foo } { bar } { break menuLoop } ) :menuLoop while ($true) { $result = $host.UI.PromptForChoice( "Menu", # menu title "Please make a selection", # menu prompt $choices, # list of choices 0 # default choice ) & $actions[$result] # execute chosen script block }

Ejecute esto en PowerShell ISE y PowerShell normal para ver cómo se comporta en cada entorno.

over 4 years ago · Santiago Trujillo Denunciar

0

Esto está sucediendo debido a su bucle do...until . Te comprometes a ejecutar el ciclo antes de que se tome la entrada del usuario. Dado que este es el caso, $Actions ya está configurado desde la iteración anterior del bucle, por lo que ejecuta lo que se había ejecutado anteriormente.

Esto significa que si no anula $Actions para cada iteración del ciclo, esto también sucederá con otros comandos.

Una solución simple a esto sería agregar un caso para que q establezca $Actions en algo que no está en la declaración de cambio que evalúa $Actions . En este caso, una cadena vacía debería funcionar.

Si necesita que funcione de manera similar para otros comandos, en lugar de tener un caso específico para q , puede usar el caso default para establecer la variable $Actions .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda