[Batch] Recorrer un fichero asignando usuarios a grupos determinados

Iniciado por gregory90, 3 Febrero 2018, 23:14 PM

0 Miembros y 2 Visitantes están viendo este tema.

gregory90

Hola,

Tengo un fichero por lotes para la creación de usuarios y grupos. En el siguiente caso los usuarios ya están previamente creados, y el siguiente código crearía los grupos y asignaría los usuarios al grupo de turnos correspondiente en base al turno que tengan.


Este sería el fichero empleados.txt que se le pasaría al for para recorrerlo:

Código (bash) [Seleccionar]
#Apellido1;Apellido2;Nombre;Cargo;Turno
ape1;ape2;user1;Administrativo;7:00 a 15:00
ape1;ape2;user2;Administrativo;7:00 a 15:00
ape1;ape2;user3;Administrativo;7:00 a 15:00
ape1;ape2;user4;Administrativo;7:00 a 15:00
ape1;ape2;user5;Administrativo;15:00 a 23:00
ape1;ape2;user6;Administrativo;15:00 a 23:00
ape1;ape2;user7;Administrativo;15:00 a 23:00
ape1;ape2;user8;Administrativo;15:00 a 23:00
ape1;ape2;user9;Jefe Departamento;7:00 a 23:00



El fichero por lotes tendría el siguiente código:

Código (bash) [Seleccionar]
setlocal enabledelayedexpansion

net localgroup Manana /add
net localgroup Tarde /add
net localgroup Jefes /add
net localgroup "Administradores" "Jefes" /add

for /f "eol=# delims=; tokens=1-5" %%i in (empleados.txt) do (
set apellido1=%%i
set apellido2=%%j
set nombre=%%k
set cargo=%%l
set turno=%%m
set login=!nombre!!apellido1:~0,1!!apellido2:~0,1!
set manana="7:00 a 15:00"
set tarde="15:00 a 23:00"
set matarde="7:00 a 23:00"

if "%turno%" == "%manana%" net localgroup "Manana" "!login!" /add
if "%turno%" == "%tarde%" net localgroup "Tarde" "!login!" /add
if "%turno%" == "%matarde%" net localgroup "Jefes" "!login!" /add
)


Básicamente lo que me está fallando es las condiciones, en la siguiente condición por ejemplo.
Código (bash) [Seleccionar]
if "%turno%" == "%manana%

Por lo que entiendo es que siempre se va cumplir?? o es lo que hace al ejecutar el script. Sin embargo, yo no lo veo tan claro, ya que si no se cumple saltaría al siguiente if hasta llegar al que se cumpla, sino se cumple ninguno saldría de la ejecución no?

Gracias y saludos!

Eleкtro

#1
Cita de: gregory90 en  3 Febrero 2018, 23:14 PM
Básicamente lo que me está fallando es las condiciones, en la siguiente condición por ejemplo.
Código (bash) [Seleccionar]
if "%turno%" == "%manana%

Por lo que entiendo es que siempre se va cumplir??

Lo que ocurre es que no estás expandiendo el valor de las variables %turno%, %manana%, %tarde% y %matarde%. Su valor siempre es "nulo", y comparar "nulo" con "nulo" siempre devolverá positivo.

Debes usar el operador ! en lugar de % al igual que lo haces con la variable login!, !nombre! y !apellido!... debes hacer lo mismo con todas y cada una de las variables que declares dentro del bloque del For.

Quedaría algo parecido a esto:

Código (DOS) [Seleccionar]
If "!turno!" EQU "!manana!"  (net localgroup "Manana" "!login!" /add)
If "!turno!" EQU "!tarde!"   (net localgroup "Tarde"  "!login!" /add)
If "!turno!" EQU "!matarde!" (net localgroup "Jefes"  "!login!" /add)


Saludos.








gregory90

Cita de: Eleкtro en  4 Febrero 2018, 00:19 AM
Debes usar el operador ! en lugar de % al igual que lo haces con la variable login!, !nombre! y !apellido!... debes hacer lo mismo con todas y cada una de las variables que declares dentro del bloque del For.

Ya cierto, y lo había probando así inicialmente, ya probé de muchas formas y sigue sin funcionar, acabo de probar con EQU por si puede ser por ==, en meterlo entre parantesis, aunque siendo una única operación daría igual.

Sigue fallando, quiero decir con fallando de que no me hace nada realmente, se ejecuta sin errores. Pero no me añade los usuarios a ningún grupo.

Por más que le doy vueltas no veo que puede estar pasando...

Eleкtro

#3
Cita de: gregory90 en  4 Febrero 2018, 01:42 AM
Sigue fallando, quiero decir con fallando de que no me hace nada realmente, se ejecuta sin errores. Pero no me añade los usuarios a ningún grupo.

Por más que le doy vueltas no veo que puede estar pasando...

Entonces probablemente sea un error de diseño en el algoritmo con respecto al análisis/parsing de datos. Sin saber lo que hay escrito en el archivo 'empleados.txt' y sin saber el string que devuelve la variable !turno! y !login!, se hace dificil saber que ocurre. Usa el comando ECHO para visualizar el valor de las variables antes de intentar añadir los usuarios, y eso te ayudará a determinar lo que puedes estar haciendo o comparando mal, o al menos a obtener alguna pista sobre ello.

Por ejemplo, aquí le estás añadiendo comillas dobles al principio y al final de cada valor:
Citar
Código (dos) [Seleccionar]
set manana="7:00 a 15:00"
set tarde="15:00 a 23:00"
set matarde="7:00 a 23:00"

...y probablemente eso no es lo que querías hacer. La sintaxis correcta sería la siguiente:
Código (dos) [Seleccionar]
set "manana=7:00 a 15:00"
set "tarde=15:00 a 23:00"
set "matarde=7:00 a 23:00"


Saludos!








gregory90

Cita de: Eleкtro en  4 Febrero 2018, 01:54 AM
Sin saber lo que hay escrito en el archivo 'empleados.txt' y sin saber el string que devuelve la variable !turno! y !login!, se hace dificil saber que ocurre.

El fichero "empleados.txt" lo dejara escrito en el princpio del post.

Cita de: Eleкtro en  4 Febrero 2018, 01:54 AM
...y probablemente eso no es lo que querías hacer. La sintaxis correcta sería la siguiente:
Código (dos) [Seleccionar]
set "manana=7:00 a 15:00"
set "tarde=15:00 a 23:00"
set "matarde=7:00 a 23:00"


Efectivamente era eso las comillas... pensaba que al establecer variables no tenían por que ir entre comillas (la propia variable), sino solamente el string que en este caso llevaba espacios en blanco.

Así ya funciona, comprobé con echo, y veo que ahora si le da el valor que corresponde, antes le daba el valor por ejemplo "7:00 a 15:00" y no 7:00 a 15:00 (sin comillas) que es el que está en el fichero de texto que se le pasa.

De ese modo, englobando todo entre comillas, entiendo que que coge todo? o como?

Saludos. y gracias @Eleкtro  ;)

Eleкtro

#5
Cita de: gregory90 en  4 Febrero 2018, 11:28 AMEl fichero "empleados.txt" lo dejara escrito en el princpio del post.

Discúlpame, se me fue la pinza xD... eso me pasa por abrir varios threads del foro al mismo tiempo y leer deprisa las dudas en los posts. Te respondí todo lo que te dije sin fijarme en el formato de ese CSV, de lo contrario diréctamente te habría mencionado lo de las comillas dobles al ver como era el formato de tu CSV y como estabas declarando las variables.

Cita de: gregory90 en  4 Febrero 2018, 11:28 AMDe ese modo, englobando todo entre comillas, entiendo que que coge todo? o como?

Exactamente, "lo coge todo" como bien dices, bueno, las variables que declaraste también lo cogen todo... cogen todo lo que hayas escrito despues del símbolo "=", incluyendo las comillas dobles que le añadiste al principio y final del string. Simplemente la próxima vez asegúrate de hacerlo como te mostré para evitar que eso suceda. Esa es la forma recomendada para declarar variables, de lo contrario puedes cometer fallos humanos como el que ya has tenido, o como el de este otro ejemplo:

Código (dos) [Seleccionar]
Set var=qwerty    & (Echo.)

Echo "%var%"

( el valor de "%var%" será "qwerty    ")

Saludos!








gregory90

Entiendo si. Gracias Elektro. Me aclaraste el tema perfectamente.

Saludos!  ;-)