Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: z3nth10n en 5 Febrero 2017, 17:14 pm



Título: Error raro con WMIC
Publicado por: z3nth10n en 5 Febrero 2017, 17:14 pm
Hola buenas,

pues veréis haciendo un script que lea las lineas de un txt y las interprete como rutas para luego obtener información como por ejemplo la fecha de creación, me he encontrado con un pequeño problema:

https://github.com/Ikillnukes/StarReset/blob/master/test.bat

(https://i.gyazo.com/6f640be13a80781e7f69f6d797a4d0eb.png)

Por lo visto, el for (si no mal lo estoy diciendo) envía tres (como minimo, si estamos leyendo una carpeta, mandará 2 + todos los archivos que posea) resultados del WMIC, uno es el del título del apartado que estamos pidiendo "CreationDate", los resultados en cuestión, y luego, un caracter en blanco que me está matando, no consigo quitarlo sin joder nada...

Cmoo véis ahí tengo una linea comentada, que comprueba si el carácter es blanco, no ejecutamos nada, mira lo que pasa:

(https://i.gyazo.com/51da53099f5ef1d7529d5299bc9091bb.png)

He tenido que modificar el codigo del que hay ahora mismo, ya que descomentandoesas lineas el cmd se me peta...

Como veis estoy un tanto/bastante perdido, alguna ayudilla no estará mal recibida :silbar:

Un saludo.


Título: Re: Error raro con WMIC
Publicado por: Eleкtro en 5 Febrero 2017, 19:02 pm
La razón es muy simple, el proceso de WMIC escribe el output en Unicode y esto deja un caracter de retorno al final del output que recibe tu FOR (es decir, estás procesando más de una linea/valor en el FOR), simplemente es un problema de codificación, siempre se debe tener esto en cuenta al usar WMIC desde Batch por que es el "fallo" más común y que da mucho por culo.

Habia una forma muy elegante para que WMIC escribiese la salida en ANSI y poder parsearla perfectamente sin realizar apenas modificaciones, creo que había que especificar algún parámetro en el comando WMIC, pero no lo recuerdo y no lo encuentro por ningún lado, así que las otras opciones que te quedan son las siguientes:

1. Iniciar la CMD (y correr tu script) en modo Unicode.
Código:
CMD.exe /U

2. Especificar un formato de salida distinto de WMIC (por ejemplo el formato de salida CSV) y adaptar los delimitadores/tokens de tu FOR.
Código:
For /f "tokens=... delims=," In ('WMIC.exe ... /Format:CSV') Do (...)
  • https://ss64.com/nt/wmic.html#format_specifiers (https://ss64.com/nt/wmic.html#format_specifiers)

3. Redireccionar la salida de WMIC al comando Find/FindSTR para evitar procesar las lineas en blanco.
Código
  1. for /f %%f in ('wmic Datafile where "name='%data_path%'" get CreationDate ^| FIND "."') do (
  2. if "%%f" NEQ "CreationDate" (
  3. echo %%f
  4. call :OUTPUT "%%f" "%target_dir%"
  5. )
  6. )

4. No usar WMIC al fin y al cabo, pues si el propósito es obtener la fecha de creación entonces puedes hacerlo con los modificadores de variable de FOR...
Código:
@Echo Off & SetLocal EnableDelayedExpansion

FOR /F "usebackq tokens=*" %%# in (
"folders.txt"
) Do (
Set "creationDate=%%~t#"
set "day=!creationDate:~0,2!"
set "month=!creationDate:~3,2!"
set "year=!creationDate:~6,4!"

    Echo Date: "!year!!month!!day!"
)

...Y por el amor de Dios, intenta seguir el ejemplo de sintaxis que he mostrado en el punto nº2, me refiero, usa los símbolos () para crear (abrir y cerrar) las correspondientes agrupaciones de comandos, sobre todo en búcles y condicionales ...o de lo contrario te auguro que en el futuro encontrarás errores de sintaxis que no sabrás de donde procederán.

EDITO: Ah, se me olvidaba comentarte...  
Aquí: if "%%f" NEQ "CreationDate" no estoy muy seguro de si lo has dejado así por algún motivo o no eres consciente de que "CreationDate" es un string, no una variable. Dicho de otra forma, siempre te va a dar positivo esa evaluación por qué estás comparando una fecha con el string "CreationDate"... quiero decir, la fecha siempre va a ser distinta: if "{formato_de_fecha_de_wmic}" no es igual a "CreationDate"

Saludos!


Título: Re: Error raro con WMIC
Publicado por: z3nth10n en 5 Febrero 2017, 19:31 pm
Muchas gracias Elektro, yo aquí rompiéndome los cuernos para ahora saber que con un for loop se puede hacer ;D

No me quedaré quieto aún así, seguiré experimentando con el WMIC...



EDITO:

Por si alguno se ha quedado con las ganas de saber más:

https://technet.microsoft.com/en-us/library/bb490909.aspx



EDITO: Ah, se me olvidaba comentarte...  
Aquí: if "%%f" NEQ "CreationDate" no estoy muy seguro de si lo has dejado así por algún motivo o no eres consciente de que "CreationDate" es un string, no una variable. Dicho de otra forma, siempre te va a dar positivo esa evaluación por qué estás comparando una fecha con el string "CreationDate"... quiero decir, la fecha siempre va a ser distinta: if "{formato_de_fecha_de_wmic}" no es igual a "CreationDate"

Esto se que es una cadena de texto, ya te digo que por alguna razón el WMIC me la devolvía... :silbar:

El /format:VALUE está chido xd

Un saludo.