El siguiente script verifica el formato de un DNI y comprueba que la letra sea válida, según el cálculo de control establecido oficialmente.
Se define como una función y se implementa fácilmente en scripts de creación de usuarios.
# Declaramos la función que va a realizar las comprobaciones function CompruebaDNI { # Si no cumple con el regex especificado, devuelve un fallo por formato incorrecto. Los DNIs tienen 8 dígitos y una letra al final. El primer dígito también puede ser una X, Y o Z en lugar de un número. if ($DNI -notmatch "^[0-9XYZ]{1}[0-9]{7}[a-zA-Z]{1}$") { # Se escribe un mensaje de advertencia si el formato no es válido. Write-Warning "El DNI introducido '$DNI' no tiene el formato correcto." # Y establecemos una variable con el estado de error. Es global para poder acceder a ella desde fuera de la función. $global:DNIFormato = "KO" } else { # Si el formato es correcto establecemos la variable como OK. $global:DNIFormato = "OK" } # Ya dado por bueno el formato, comprobamos que la letra cumpla con las normas establecidas. if ($global:DNIFormato -eq "OK") { # Cogemos la letra, que es el último dígito del string. $DNILetra = $DNI.Substring($DNI.length - 1) # Si el primer carácter es una X, Y o Z la convertimos en un '0'. $DNInumeros= $DNI -replace ("X","0") -replace ("Y","1") -replace ("X","2") # Ahora que todo son números cogemos los 8 primeros para hacer el cálculo. $DNInumeros= $DNInumeros.Substring(0,8) # Se calcula el resto de dividirlo entre 23. $DNIresto= $DNInumeros%23 # Según el valor del resto establecemos cual es la letra para ese número de DNI. if ($DNIresto -eq 0) {$LetraDNI = "T"} if ($DNIresto -eq 1) {$LetraDNI = "R"} if ($DNIresto -eq 2) {$LetraDNI = "W"} if ($DNIresto -eq 3) {$LetraDNI = "A"} if ($DNIresto -eq 4) {$LetraDNI = "G"} if ($DNIresto -eq 5) {$LetraDNI = "M"} if ($DNIresto -eq 6) {$LetraDNI = "Y"} if ($DNIresto -eq 7) {$LetraDNI = "F"} if ($DNIresto -eq 8) {$LetraDNI = "P"} if ($DNIresto -eq 9) {$LetraDNI = "D"} if ($DNIresto -eq 10) {$LetraDNI = "X"} if ($DNIresto -eq 11) {$LetraDNI = "B"} if ($DNIresto -eq 12) {$LetraDNI = "N"} if ($DNIresto -eq 13) {$LetraDNI = "J"} if ($DNIresto -eq 14) {$LetraDNI = "Z"} if ($DNIresto -eq 15) {$LetraDNI = "S"} if ($DNIresto -eq 16) {$LetraDNI = "Q"} if ($DNIresto -eq 17) {$LetraDNI = "V"} if ($DNIresto -eq 18) {$LetraDNI = "H"} if ($DNIresto -eq 19) {$LetraDNI = "L"} if ($DNIresto -eq 20) {$LetraDNI = "C"} if ($DNIresto -eq 21) {$LetraDNI = "K"} if ($DNIresto -eq 22) {$LetraDNI = "E"} # Si la letra que hemos indicado coincide con la que se ha calculado, entonces lo damos por bueno. if ($DNILetra -eq $LetraDNI) { $global:DNILetraCheck = "OK" } # De lo contrario lo damos por incorrecto y devolvemos un mensaje de aviso. else { $global:DNILetraCheck = "KO" Write-Warning "ERROR: La letra del DNI no es correcta, debería de ser $LetraDNI." } } } # Ya fuera de la función empieza el script, pidiendo al usuario que introduzca un DNI. $DNI = Read-Host "Introduce el DNI" # Llamamos a la función para comprobarlo. CompruebaDNI # Si el formato o la letra son incorrectas, volvemos a pedirlo. if ($DNIFormato -eq "KO" -or $global:DNILetraCheck -eq "KO") { # Y lo seguimos pidiendo indefinidamente hasta que sea correcto. do { $DNI = Read-Host "Introduce un DNI válido para este usuario" CompruebaDNI } until (($DNIFormato -eq "OK") -and ($DNILetraCheck -eq "OK")) } # Y ya cuando es correcto devolvemos un mensaje indicando que es válido y termina el script. Write-Host "DNI '$DNI' válido!!" -ForegroundColor "Green" ############# #### FIN #### #############
¡Espero que le encontréis utilidad! Un saludo!
Deja una respuesta