如何从powershell命令设置环境variables?

我想要一个包含cmd.exe中星期几的环境variables。

当我运行这个命令时,我得到了我想要的结果。

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

在这里我试图将结果存储在一个环境variables中。

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

但是,当我试图得到它,我没有得到我想要的string。

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

我的目标是将batch file中的variables用于某些备份脚本。

你可以使用像这样的东西:

 $env:DOW = "foo" 

我相信,如Dan所build议的,使用[Environment]::SetEnvironmentVariable从powershell中设置环境variables是毫无意义的,因为如果你select了临时的“process”上下文,或者不会在powershell终止的时候丢失variables的内容你的batch file的环境, 但是如果你select永久的“机器”或“用户”上下文 – 也就是说,除非你的整个脚本是用PowerShell编写的,否则问题不会出现在第一位:

 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> 

您可以使用for命令作为一种解决方法来parsingpowershell命令的输出并将其放入一个variables中

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

注意在你的powershell调用中脱字符特殊字符的脱字符^

如果您是从命令行进行testing,而不是从batch file上下文中进行testing,则需要用%replace%%之前的variables引用:

 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> 

您应该在PowerShell中运行这两个命令,因为Powershell不仅能够操作环境variables。

即:

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

要么

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

顺便说一句,你的脚本不起作用,因为你得到的只是Powershell的返回码,而不是它产生的数据。 可能有一种方法可以使其正常工作,但与仅使用适当的Powershell脚本相比,它最终没有意义。

为了完整起见,这里是来自MS上Powershell和环境variables的一篇不错的文章:

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

更新:使用@ syneticon-dj在聊天中查看了这个解决scheme后,看起来使用这种方法面临的问题是命令提示符必须重新加载,才能反映外部发生的环境variables的变化。

你没有提供关于你在做什么的详细信息,但是如果这是你启动Powershell的唯一原因,那么我的实际build议就是检查你是如何做的。

要么使用PowerShell完成整个过程,要么考虑使用计划任务? 您可以根据星期几安排任务。

如果是我,并且父脚本必须是shell脚本,那么我只需在.CMD脚本中进行PowerShell的厚颜无耻的调用,如下所示:

 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 

您可能需要检查您的PowerShell执行策略(Set-ExecutionPolicy cmdlet)。

或者如果你已经结婚了,可以直接跳过Powershell。

使用%date%variables,并从它给出的缩写中展开一天(这可能会受到区域date格式设置的影响)

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

抓住答案中的第一个标记并展开:

 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 

如果您希望batch file访问由该batch file运行的powershell命令设置的环境variables,则可以使用以下解决方法:

让你的powershell创build一个包含“set variable = value”行的子批次mysub.bat文件,并在powershell命令后面执行主batch file中的mysub.batbatch file。

使用WriteAllLines方法而不是默认的powershell输出方法,以便不会使用UTF-8编码格式生成子batch file。

main.bat:

 REM main.bat first line powershell -Command "[System.IO.File]::WriteAllLines(\".\mysub.bat\", \"set VARIABLE=VALUE\");" .\mysub.bat echo VARIABLE=%VARIABLE% REM expected output: VARIABLE=VALUE 

其实,当把下面的东西放在一个ps1文件(比如说t.ps1)中,并使用PowerShell -File t.ps1从一个CMD会话中调用它时…效果很好。

 $DateAndTime = (get-date -UFormat "%Y%m%d_%H%M%S")[Environment]::SetEnvironmentVariable("DateAndTime", $DateAndTime, "Machine") 

但不适用于t.ps1脚本被调用的CMD会话。 在新的CMD会议中,我们得到:

D:> echo%DateAndTime%==> 20120208_123106

我想我们必须找出如何在CMD会话中完成类似export T=date事情。