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 trato de obtenerlo, no obtengo la cadena 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 algunos scripts de respaldo.
PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
Debe ejecutar ambos comandos en PowerShell ya que PowerShell es más que capaz de manipular variables ambientales.
Es decir:
o
Por cierto, su script no funciona porque todo lo que obtiene es el código de retorno de PowerShell, no los datos que produce. Puede haber una manera de hacer que funcione, pero en última instancia no tiene sentido en comparación con solo usar un script de PowerShell adecuado.
Para completar, aquí hay un buen artículo de Microsoft sobre PowerShell y variables ambientales:
Crear y modificar variables de entorno
Actualización: Después de revisar esta solución con @ syneticon-dj en el chat, parece que el problema que enfrenta al usar este método es que se debe volver a cargar un símbolo del sistema antes de que refleje los cambios en las variables ambientales que se han producido externamente.
No ha proporcionado muchos detalles sobre lo que está haciendo, pero si esta es la única razón por la que está iniciando PowerShell, mi sugerencia real sería revisar cómo está haciendo las cosas.
¿Su proceso completo usa PowerShell o ha considerado usar tareas programadas? Puede programar tareas según el día de la semana.
fuente
Creo que la variable de entorno desde dentro PowerShell con
[Environment]::SetEnvironmentVariable
lo sugerido por Dan no tiene sentido, ya que tendría ya sea perder el contenido de la variable a la terminación de PowerShell si elige el "proceso" contexto temporal o no lo haría en el entorno de su archivo por lotes sin embargo, si elige el contexto permanente "máquina" o "usuario", es decir, a menos que todo su script esté escrito en PowerShell, donde el problema no surgiría en primer lugar:Puede usar el
for
comando como solución alternativa para analizar el resultado de su comando de PowerShell y ponerlo en una variable:Tenga en cuenta los caracteres de intercalación
^
utilizados para escapar de los caracteres especiales de paréntesis dentro de su llamada de PowerShell.Si lo está probando desde la línea de comandos y no desde un contexto de archivo por lotes, deberá reemplazar las
%%
referencias de variables anteriores por%
:fuente
[Environment]::SetEnvironmentVariable("DOW", $dow, "user")
desde una sesión de PowerShell en ejecución, pero no estaba presente en mi sesión de cmd principal al finalizar PowerShellSET
símbolo del sistema. Intenta comenzar un niñocmd.exe
y verás lo mismo. Sin embargo, el comportamiento que está viendo en PowerShell se debe a que la actualización de las variables de entorno a través de las clases .NET no afecta el proceso actual.Si fuera yo, y el script principal tiene que ser un script de shell, simplemente haría una invocación descarada de PowerShell en el script .CMD como:
Es posible que deba verificar su política de ejecución de PowerShell (cmdlet Set-ExecutionPolicy).
fuente
O si está casado con esto en el viejo shell, omita PowerShell por completo.
Use la variable% date% y expanda el día desde la abreviatura que proporciona (esto podría verse afectado por la configuración de formato de fecha regional):
Tome el primer token en la respuesta y amplíe eso:
fuente
En realidad, cuando coloca algo como lo siguiente en un archivo .ps1 (digamos
t.ps1
) y lo llama desde una sesión CMD con PowerShell-File t.ps1
... funciona bien.Pero no para la sesión CMD desde donde se ha llamado al script t.ps1. En una nueva sesión de CMD obtenemos:
Supongo que tenemos que descubrir cómo hacer algo como
export T=date
en una sesión de CMD.fuente
Si desea que su archivo por lotes acceda a las variables de entorno establecidas por un comando de PowerShell ejecutado desde ese archivo por lotes, puede usar la siguiente solución:
Haga que su script de PowerShell cree un archivo por lotes secundario
mysub.bat
, que contenga líneas "set variable = value", y ejecute ese archivo por lotes mysub.bat desde el archivo por lotes principal justo después del comando PowerShell.Utilice el método WriteAllLines en lugar de los métodos de salida predeterminados de PowerShell para que el archivo de sub lotes no se genere con el formato de codificación UTF-8.
Ejemplo
main.bat:
fuente