es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PowerShell no está analizando los datos como se espera // Pregunta básica sobre los operadores de PowerShell

Tengo una pregunta bastante básica sobre el uso adecuado de ciertos operadores. Estoy escribiendo un script que extrae datos de un archivo CSV. El script le solicita al usuario que ingrese un número de ubicación y luego debe mostrar la IP de su servidor.

El script funciona como se espera, excepto en las filas donde el número de ubicación también tiene otros textos, como números o caracteres especiales.

Aquí hay un ejemplo de CSV para ilustrar mi problema:

Locación,Estado,IP del servidor
1,NY,10.0.0.1
2,CA,10.0.0.2
3,WA,10.0.0.3
4 (inp),KY,10.0.0.4

Mi script se ve algo así:

$CSV = import-csv C:\users\Self\MyProject.csv

$ubicacion = read-host "Ingrese el número de ubicación"

foreach($fila in $CSV){
    if($fila.Locación -eq $ubicacion){
        write-host $fila.'IP del servidor'
    }
}

Ahora, este script funciona como se espera, a menos que el usuario elija la ubicación 4. Si el usuario elige la ubicación 4, entonces la variable $ubicacion queda en blanco.

Ok, esto tiene un poco de sentido ya que estoy usando el operador -eq. Pero incluso si uso el operador -contains obtengo los mismos resultados.

Aquí hay otra forma de mostrar mi problema:

$número = "10 diez"

if ($número -contains "10"){ (Write-Host "verdadero")} else{ write-host "falso"}
falso

Ahora, ¿por qué la salida no se muestra como “verdadero” si esa variable $número realmente contiene “10”?

Cualquier ayuda es muy apreciada.
Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hola,

    Gracias por solicitar ayuda con tu script.

    Basado en los ejemplos que proporcionaste, parece que el problema está en la forma en que estás comparando el número de ubicación ingresado por el usuario con los números de ubicación en el archivo CSV.

    Cuando usas el operador -eq, PowerShell realiza una coincidencia exacta entre los dos valores. Esto significa que si hay cualquier caracter adicional o espacios en el número de ubicación en el archivo CSV, la comparación fallará.

    Para solucionar este problema, puedes utilizar en cambio los operadores -like o -match. Estos operadores te permiten utilizar caracteres comodín para buscar patrones dentro de la cadena.

    Por ejemplo, para encontrar cualquier fila donde el número de ubicación contenga el número de ubicación ingresado por el usuario, puedes utilizar el siguiente código:

    foreach ($row in $CSV) {
        if ($row.Loc# -like "*$location*") {
            Write-Host $row.'Server IP'
        }
    }
    

    En este código, se utiliza el operador -like para comparar el número de ubicación en la fila del CSV con el número de ubicación ingresado por el usuario. Los caracteres comodín “*” se utilizan para coincidir con cualquier caracter adicional antes o después del número de ubicación.

    De manera similar, puedes utilizar el operador -match con una expresión regular para obtener el mismo resultado:

    foreach ($row in $CSV) {
        if ($row.Loc# -match "^$location") {
            Write-Host $row.'Server IP'
        }
    }
    

    En este código, la expresión regular “^$location” coincide con cualquier fila donde el número de ubicación comienza con el número de ubicación ingresado por el usuario.

    Con respecto a tu segundo ejemplo, nuevamente parece que el problema está en la forma en que estás comparando los valores. Cuando utilizas el operador -contains, PowerShell verifica si el lado izquierdo contiene el lado derecho como un elemento en un arreglo. En este caso, la variable $number no es un arreglo, por lo que la comparación falla.

    Para verificar si una cadena contiene una subcadena específica, puedes utilizar el operador -like con caracteres comodín como se muestra en el primer ejemplo.

    Espero que esto te ayude a resolver tu problema. Déjame saber si tienes alguna otra pregunta o inquietud.

Comments are closed.