Estaba creando un proyecto en el que necesitaba cambiar la zona horaria a UTC para que las pruebas se ejecuten considerando solo la zona horaria UTC. Así que he creado este código de lote:

FOR /F "tokens=* USEBACKQ" %%F IN (`tzutil /g`) DO SET PREVIOUS_TZ=%%F
tzutil /s "UTC"
cmd.exe /c npm run test:unit:base
tzutil /s "%PREVIOUS_TZ%"

Me pregunto cómo es posible devolver la zona horaria anterior de UTC después de completar las pruebas. Descubrí que podemos usar "posttest" para enganchar la finalización de las pruebas. Entonces, de nuevo, ¿cómo podemos devolver la zona horaria anterior con el script por lotes?

0
MII 11 feb. 2020 a las 14:00

2 respuestas

La mejor respuesta

Parece que ya tenía UTC que se configuró con su prueba inicial y fue heredado ... de todos modos, preferiría hacer algo como esto.

Usaría delims= en lugar de tokens=*. La configuración de las variables se realiza mejor cerrándolas entre comillas dobles al principio de la propiedad, al final de su valor. es decir, set "PREVIOUS_TZ=%%f" modifiqué los nombres de las variables para adaptarme mejor a mi sensación.

@echo off
for /F "delims=" %%f in ('tzutil /g') do set "oldtz=%%f"
tzutil /s "UTC"
cmd.exe /c npm run test:unit:base
tzutil /s "%oldtz%"
for /F "delims=" %%a in ('tzutil /g') do if not "%oldtz%" == "%%a" (
    echo Old timezone of "%oldtz%" was not set successfully. It is still %%a
)
pause

Esto debería establecerlo perfectamente bien cada vez, pero en caso de que no lo haga, le informará al respecto.

1
Gerhard Barnard 11 feb. 2020 a las 12:28

Ofrecería esta metodología:

@Echo Off

Rem Enter your required interim timezone below here.
Set "Interim_TZ=UTC"

Rem The next four non remarked lines determine,
Rem  whether your current timezone requires changing to the interim one,
Rem  and defines a variable containing your current one, if it does.
Set "Initial_TZ="
For /F "Delims=" %%G In (
    '""%__AppDir__%tzutil.exe" /G | "%__AppDir__%findstr.exe" /VXC:"%Interim_TZ%""'
) Do Set "Initial_TZ=%%G"

Rem The below line will change the timezone, if it is not currently the interim one.
If Defined Initial_TZ "%__AppDir__%tzutil.exe" /S "%Interim_TZ%"

Rem Your commands using the interim timezone go below here.
Call "%ProgramFiles%\nodejs\npm.cmd" run test:unit:base

Rem If your initial timezone was different from the interim one,
Rem and you no longer need it assigned to the interim one,
Rem the next non remarked line changes it back again.
If Defined Initial_TZ "%__AppDir__%tzutil.exe" /S "%Initial_TZ%"

La idea es que verifique su zona horaria actual y, si aún no lo está, UTC establece una variable que contiene esa zona horaria. La zona horaria solo cambia y se revierte si fuera necesario. Además, he utilizado Call para invocar el comando npm en la misma ventana que el script en ejecución. Si he adivinado su ruta de forma incorrecta, cámbiela según sea necesario.

1
Compo 11 feb. 2020 a las 15:15