Windows命令提示符:如何将命令的输出转换为环境变量?


59

我想在cmd.exe中包含一个包含星期几的环境变量。

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

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

在这里,我试图将结果存储在环境变量中。

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

但是,当我尝试获取它时,却没有得到想要的字符串。

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

我的目标是将批处理文件中的变量用于某些备份脚本。

Answers:


87

您可以使用类似:

$env:DOW = "foo"

3
我不明白为什么要对此进行否定标记,您知道设置环境变量更好吗?
Ion Todirel 2013年

2
+1在我需要的情况下,这对我来说非常有用。PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
大卫·鲁曼

14
@IonTodirel因为这仅在进程空间中保留。
JohnD 2014年

终于我现在了解了如何在powershell中设置RAILS_ENV
有线

然后如何输出以确保其正常工作?
CodyBugstein

22

您应该在PowerShell中运行这两个命令,因为PowerShell不仅具有处理环境变量的能力。

即:

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

要么

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

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

为了完整起见,这是Microsoft撰写的有关PowerShell和环境变量的精彩文章:

创建和修改环境变量

更新:在聊天中使用@ syneticon-dj查看了此解决方案后,使用此方法遇到的问题似乎是必须重新加载命令提示符,才能反映外部环境变量的变化。

您尚未提供有关正在执行的操作的详细信息,但是,如果这是启动PowerShell的唯一原因,那么我的实际建议就是检查您的运行情况。

您是使用PowerShell进行整个过程,还是考虑使用计划任务?您可以根据星期几安排任务。


批处理文件将每天运行,并从计划的任务运行。我正在考虑在Powershell中工作。但是在Powershell中,我比cmd还要新手。现在,我在执行简单命令方面遇到困难。但是我可以对此提出一个新问题,也许对您来说这是一个简单的问题:)编辑:我已经弄清楚了。这是如何使用某些参数运行程序。
蒂姆(Tim)

我也不擅长PowerShell,但是值得学习。首先,它几乎在所有方面都变得更好,但这也是Microsoft(以及其他制造商)发展的方式。
2012年

1
另外,请注意,@ Dan的上述建议非常永久地设置了环境变量(在Machine或User上下文中)。如果省略了第三个参数,则可以仅针对当前过程进行设置,这有时更可取。
Per Lundberg

20

我相信,[Environment]::SetEnvironmentVariable如Dan所建议的那样,在PowerShell中设置环境变量是没有意义的,因为如果您选择临时的“进程”上下文,或者在批处理文件的环境中没有该变量,则在PowerShell终止时将丢失该变量的内容。如果您选择永久的“机器”或“用户”上下文-也就是说,除非您的整个脚本是用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命令作为变通办法来解析PowerShell命令的输出并将其放入变量中:

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

请注意^用于在PowerShell调用中转义括号特殊字符的脱字符号。

如果要从命令行而不是在批处理文件上下文中进行测试,则需要使用以下命令替换%%before变量引用%

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>

不,这是不正确的。低于来自任何批处理文件等访问组“正常”的环境变量,我的例子

@Dan我相信您是错的,我已经尝试[Environment]::SetEnvironmentVariable("DOW", $dow, "user")从正在运行的Powershell会话中进行设置,但是在PowerShell终止后我的父cmd会话中不存在该设置
the-wabbit 2012年

格式搞砸了,但是您尚未定义$ dow。在Powershell脚本中运行我的示例将按预期存储正常的环境变量。
2012年

1
@Dan BTW:我不介意低估,但应该指出的是,演示方法显然可以满足发问者的要求,因此,即使有更优雅的方法,仍然是解决问题的有效方法。
the-wabbit 2012年

1
@ the-wabbit听起来像Windows中的正常行为。即使您更新全局环境变量,也只有自更新以来启动进程才能识别更改。由于您是在谈论流程,因此它必须在更改之前启动。SET在命令提示符中也会发生相同的情况。尝试生一个孩子cmd.exe,您会看到同样的事情。但是,您 PowerShell中看到的行为是因为通过.NET类更新环境变量不会影响当前进程。
jpmc26 2016年

4

如果是我,而父脚本已经是一个shell脚本,我只是做的PowerShell在.CMD脚本像面露调用:

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)。


3

或者,如果您愿意在旧的Shell中执行此操作,请完全跳过PowerShell。

使用%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

1
的Windows 10,不会在%DATE%显示DOW:H:\>回声%日期%20/03/2019
劳尔·萨利纳斯,蒙特阿古

1

实际上,将如下所示的内容放入.ps1文件(例如t.ps1)并在使用PowerShell的CMD会话中调用它时-File t.ps1...效果很好。

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

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

D:>回声%DateAndTime%==> 20120208_123106

我想我们必须找出如何完成export T=dateCMD会话中的操作。


1

如果您希望该批处理文件访问由该批处理文件运行的PowerShell命令设置的环境变量,则可以使用以下解决方法:

使您的PowerShell脚本创建一个mysub.bat包含“设置变量=值”行的子批处理文件,并在PowerShell命令之后立即从主批处理文件执行该mysub.bat批处理文件。

使用WriteAllLines方法而不是默认的PowerShell输出方法,以便不会以UTF-8编码格式生成子批处理文件。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.