63 votos

¿Cómo establezco una variable ambiental desde un comando powerhell?

Quiero tener una variable de entorno que contenga el día de la semana en cmd.exe.

Cuando ejecuto este comando obtengo el resultado que quiero.

C:\Users\tisc>powershell (get-date).dayofweek
Friday

Aquí estoy tratando de almacenar el resultado en una variable de entorno.

C:\Users\tisc>set dow = powershell (get-date).dayofweek

Pero cuando intento conseguirlo no consigo la cuerda como quería.

C:\Users\tisc>set dow
DoW=0
dow = powershell (get-date).dayofweek

Mi objetivo es usar la variable en un archivo por lotes para alguna copia de seguridad scripts.

92voto

umpirsky Puntos 2922

puedes usar algo como:

$env:DOW = "foo"

23voto

Dan Puntos 12476

Debes ejecutar ambos comandos en PowerShell ya que Powershell es más que capaz de manipular las variables del entorno.

Es decir..:

$dow = (get-date).dayofweek
[Environment]::SetEnvironmentVariable("DOW", $dow, "Machine")

o

[Environment]::SetEnvironmentVariable("DOW", $dow, "User")

Por cierto, tu script no funciona porque lo único que obtienes es el código de retorno de Powershell, no los datos que produce. Puede que haya una forma de hacer que funcione, pero al final no tiene sentido si lo comparamos con el uso de un Powershell adecuado script.

Para completar, aquí hay un buen artículo de la EM sobre la cáscara de poder y las variables ambientales:

http://technet.microsoft.com/en-us/library/ff730964.aspx

Actualizar: Habiendo revisado esta solución con @syneticon-dj en el chat, parece que el problema al que se enfrenta con este método es que una línea de comandos tiene que ser recargada antes de que refleje los cambios en las variables ambientales que han ocurrido externamente.

No has dado muchos detalles sobre lo que estás haciendo, pero si esta es la única razón por la que estás lanzando Powershell, entonces mi sugerencia sería revisar cómo estás haciendo las cosas.

¿O bien todo el proceso se realiza con PowerShell o ha considerado usar tareas programadas en su lugar? Puede programar tareas basadas en el día de la semana.

21voto

the-wabbit Puntos 28168

Creo que establecer el entorno variable desde el interior de la cáscara de poder con [Environment]::SetEnvironmentVariable como sugiere Dan, no tiene sentido porque perderías el contenido de la variable al terminar el PowerShell si eliges el contexto de "proceso" temporal o no lo tendrías en el entorno de tu archivo por lotes. todavía si eliges el contexto permanente de "máquina" o "usuario", es decir, a menos que todo tu script esté escrito en PowerShell, donde el problema no surgiría en primer lugar:

C:\Users\myuser>echo %DOW%
%DOW%

C:\Users\myuser>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

PS C:\Users\myuser> $dow = (get-date).dayofweek
PS C:\Users\myuser> [Environment]::SetEnvironmentVariable("DOW", $dow, "User")
PS C:\Users\myuser> [Environment]::SetEnvironmentVariable("DOW", $dow, "Process")
PS C:\Users\myuser> exit

C:\Users\myuser>echo %DOW%
%DOW%

C:\Users\myuser>

Podrías usar el for como una solución para analizar la salida de su comando powerhell y ponerla en una variable

  for /F "usebackq tokens=1" %%i in (`powershell ^(get-date^).dayofweek`) do set DOW=%%i

Fíjese en los caracteres de los caretos ^ usado para escapar de los paréntesis especiales dentro de su llamada "powerhell".

Si lo está probando desde la línea de comandos y no desde el contexto de un archivo por lotes, tendría que reemplazar el %% antes de las referencias variables por % :

C:\Users\myuser>for /F "usebackq tokens=1" %i in (`powershell ^(get-date^).dayofw
eek`) do set DOW=%i

C:\Users\myuser>set DOW=Friday

C:\Users\myuser>

4voto

Simon Catlin Puntos 4026

Si fuera yo, y el padre script tiene para ser un Shell Shell, sólo haría una pícara invocación de PowerShell en el .CMD Shell como:

set DOW=
for /f %%D in ('%SystemRoot%\System32\WindowsPowerShell\V1.0\powershell.exe -NoLogo -NoProfile -Command Write-Host -Object ^(Get-Date^).DayOfWeek;') do set DOW=%%D

Tal vez necesite revisar su política de ejecución de PowerShell (Set-ExecutionPolicy cmdlet).

2voto

M Jeremy Carter Puntos 21

O si estás casado con hacer esto en la vieja Shell, salta Powershell por completo.

Utilice la variable %date% y amplíe el día a partir de la abreviatura que proporciona (Esto podría verse afectado por los ajustes del formato de fecha regional)

C:\>echo %date%
Thu 09/05/2013

Agarra la primera ficha de la respuesta y amplía eso:

C:\>type dayofweek.cmd
@echo off
for /f %%A in ("%date%") do set DAYOFWEEK=%%A
if "%DAYOFWEEK%" == "Mon" set DAYOFWEEK=Monday
if "%DAYOFWEEK%" == "Tue" set DAYOFWEEK=Tuesday
if "%DAYOFWEEK%" == "Wed" set DAYOFWEEK=Wednesday
if "%DAYOFWEEK%" == "Thu" set DAYOFWEEK=Thursday
if "%DAYOFWEEK%" == "Fri" set DAYOFWEEK=Friday
if "%DAYOFWEEK%" == "Sat" set DAYOFWEEK=Saturday
if "%DAYOFWEEK%" == "Sun" set DAYOFWEEK=Sunday
echo.%DAYOFWEEK%
C:\>
C:\>dayofweek
Thursday

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X