Problema al crear usuarios desde el contenido de un fichero de texto (BATCH)

Iniciado por juntacadaveres, 22 Abril 2019, 16:24 PM

0 Miembros y 1 Visitante están viendo este tema.

juntacadaveres

Tengo este archivo de texto plano
CitarPEPITO:PEPITO
SAMSUNG:SAMSUNG
JUDASPRIEST:JUDASPRIEST
HOJA:HOJA
CAMA:ALMOHADA
USUARIO1:USUARIO2

El primer campo son los nombres de usuarios y el segundo son las contraseñas.
El caracter delimitador es el símbolo ':'
A partir de esto debo crear cuentas de usuario en windows mediante un script de batch
yo he hecho esto

Código (dos) [Seleccionar]

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN (USUARIOS.txt) DO (
    ECHO USUARIO: %%A CON: %%B
)
PAUSE>NUL


RESULTADO
CitarUSUARIO: PEPITO CON: PEPITO
USUARIO: SAMSUNG CON: SAMSUNG
USUARIO: JUDASPRIEST CON: JUDASPRIEST
USUARIO: HOJA CON: HOJA
USUARIO: CAMA CON: ALMOHADA
USUARIO: USUARIO1 CON: USUARIO2

Ahora bien
si agrego el comando NET USER para agregar cuentas en el sistema operativo:


Código (dos) [Seleccionar]
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F "TOKENS=1,2 DELIMS=:" %%A IN (USUARIOS.txt) DO (
    ECHO USUARIO: %%A CON: %%B
    NET USER %%A %%B /ADD
)
PAUSE>NUL


ejecuto el script para tener derechos y el resultado es el siguiente:

El sistema no puede encontrar el archivo USUARIOS.txt.

Por qué??

MCKSys Argentina

Hola!

Si ejeuctas el bat como admin, entonces el directorio actual cambia. Por eso el script no encuentra el archivo.

Si el txt esta en el mismo dir que el bat, entonces podrias usar %~dp0 para obtener el path completo al bat (sin el filename).

Mas info: https://stackoverflow.com/questions/4419868/what-is-the-current-directory-in-a-batch-file

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


juntacadaveres

Cita de: MCKSys Argentina en 22 Abril 2019, 16:31 PM
Hola!

Si ejeuctas el bat como admin, entonces el directorio actual cambia. Por eso el script no encuentra el archivo.

Si el txt esta en el mismo dir que el bat, entonces podrias usar %~dp0 para obtener el path completo al bat (sin el filename).

Mas info: https://stackoverflow.com/questions/4419868/what-is-the-current-directory-in-a-batch-file

Saludos!

Hola, gracias por contestar
no habría otra forma de hacer esto?
es que eso que mencionas tú no lo hemos visto en clase
y si le pongo cosas que no hayamos visto en clase mi profesor no lo valorará
por muy asqueroso que parezca

EdePC

Saludos,

- Entonces pon la ruta completa del fichero USUARIOS.txt (C:\Users\Usuario\Desktop\USUARIOS:txt) o has un CD a la carpeta del fichero. Recuerda que puedes usar variables internas como %SystemDrive%, %UserProfile%, etc

juntacadaveres

#4
Cita de: MCKSys Argentina en 22 Abril 2019, 16:31 PM
Hola!

Si ejeuctas el bat como admin, entonces el directorio actual cambia. Por eso el script no encuentra el archivo.

Si el txt esta en el mismo dir que el bat, entonces podrias usar %~dp0 para obtener el path completo al bat (sin el filename).

Mas info: https://stackoverflow.com/questions/4419868/what-is-the-current-directory-in-a-batch-file

Saludos!

Hola
El enunciado del script que me mandaron era así:

Ejercicio 11.
Crea un batch que, partiendo de un fichero, cree los usuarios especificados. El fichero
se denominará USUARIOS.TXT y sus registros seguirán el siguiente patrón
NOMRE:CONTRASEÑA. Se comprobará si el usuario existe. Si existe, no se crea y se informa. Si
no existe, se pide confirmación, se crea y se informa. Tras la creación de cada usuario se
pregunta si se desea continuar con el siguiente registro (mostrando el nombre de usuario a
crear) o abandonar.

Contenido del texto:

CitarGILBERTO:GILBERTO
PEPITO:PEPITO
SAMSUNG:SAMSUNG
JUDASPRIEST:JUDASPRIEST
JOSEFINA:JOSEFINA
GABRIEL:GABRIEL

Bueno, yo hice el script siguiente:


Código (dos) [Seleccionar]

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
REM COMPROBAR PERMISOS
NET SESSION >NUL 2>NUL
   IF NOT ERRORLEVEL 1 (
       GOTO :COMPROBAR
   ) ELSE (
       ECHO NO TIENES PERMISO PARA USAR ESTE FICHERO && PAUSE>NUL && EXIT
   )
:COMPROBAR
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN (C:\Users\alumno\Desktop\USUARIOS.txt) DO (
   NET USER %%A >NUL 2>NUL
       IF NOT ERRORLEVEL 1 (
           ECHO EL USUARIO %%A YA EXISTE && PAUSE>NUL
       ) ELSE (
           ECHO ========================
           ECHO EL USUARIO %%A NO EXISTE
           ECHO 1- CREAR
           ECHO 2- SALIR
           ECHO ========================
           SET /P OPT="QUE DESEA HACER? >"
           IF !OPT! EQU 1 (
               NET USER %%A %%B /ADD >NUL && ECHO EL USUARIO %%A SE HA CREADO && TIMEOUT 1 /NOBREAK >NUL
           )
           IF !OPT! EQU 2 (
               ECHO SALIENDO DEL PROGRAMA... && PAUSE>NUL && EXIT
           )
       )
)
PAUSE>NUL


Funcionar, funciona perfectamente
pero solo si fichero USUARIOS.txt se encuentra en el escritorio
y el usuario es alumno. (C:\users\alumno....)
Que pasaría si el batch me lo llevo a otra computadora.
Habría que cambiarle la ruta completa en el contenido del FOR
C:\Users\alumno\Desktop\USUARIOS.txt
o habría otra forma ??
Lo digo porque al ejecutarlo como administrador, el directorio actual cambia.
Y es obvio que si me lo llevo a otra computadora el directorio del texto lo debo cambiar
Yo quiero que el mismo batch se encuentre en la misma carpeta que el fichero USUARIOS.txt
Que habría que modificarle al script?
%~dp0 ?

EdePC

- Pues si no quieres usar %~dp0, como dije puedes usar variables predeterminsdas, por ejemplo "%UserProfle%\Desktop\" apunta siempre al Escritorio del Usuario Actual.

MCKSys Argentina

Usando %~dp0

Código (dos) [Seleccionar]

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
REM COMPROBAR PERMISOS
NET SESSION >NUL 2>NUL
    IF NOT ERRORLEVEL 1 (
        GOTO :COMPROBAR
    ) ELSE (
        ECHO NO TIENES PERMISO PARA USAR ESTE FICHERO && PAUSE>NUL && EXIT
    )
:COMPROBAR
SET mypath=%~dp0
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN (%mypath%USUARIOS.txt) DO (
    NET USER %%A >NUL 2>NUL
        IF NOT ERRORLEVEL 1 (
            ECHO EL USUARIO %%A YA EXISTE && PAUSE>NUL
        ) ELSE (
            ECHO ========================
            ECHO EL USUARIO %%A NO EXISTE
            ECHO 1- CREAR
            ECHO 2- SALIR
            ECHO ========================
            SET /P OPT="QUE DESEA HACER? >"
            IF !OPT! EQU 1 (
                NET USER %%A %%B /ADD >NUL && ECHO EL USUARIO %%A SE HA CREADO && TIMEOUT 1 /NOBREAK >NUL
            )
            IF !OPT! EQU 2 (
                ECHO SALIENDO DEL PROGRAMA... && PAUSE>NUL && EXIT
            )
        )
)
PAUSE>NUL


La variable %~dp0 termina en "\". Si quieres quitarle esa barra, puedes usar %mypath:~0,-1%. Pero, en el FOR, en vez de usar %mypath%USUARIOS.txt, vas a tener que usar %mypath%\USUARIOS.txt

Otra opcion seria poner todo (txt y bat) en una carpeta que sea leible por todos los usuarios, usando variables de entorno, como por ejemplo %PUBLIC%. En otras palabras:

Código (dos) [Seleccionar]

REM ...
SET mypath=%PUBLIC%
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN (%PUBLIC%\USUARIOS.txt) DO (
REM ...


Ten en cuenta que esa variable de entorno no termina con "\", por lo cual la debes agregar.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."