Windows 命令提示符:如何将命令的输出放入环境变量中?

Windows 命令提示符:如何将命令的输出放入环境变量中?

我想要一个包含 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

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

答案1

您可以使用类似如下的方法:

$env:DOW = "foo"

答案2

您应该在 PowerShell 中运行这两个命令,因为 PowerShell 完全有能力操作环境变量。

IE:

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

或者

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

顺便说一句,您的脚本不起作用,因为您得到的只是 PowerShell 返回代码,而不是它生成的数据。可能有办法让它工作,但与仅使用正确的 PowerShell 脚本相比,这最终毫无意义。

为了完整起见,这里有一篇来自 Microsoft 的关于 PowerShell 和环境变量的精彩文章:

创建和修改环境变量

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

您没有提供有关您正在做的事情的详细信息,但如果这是您启动 PowerShell 的唯一原因,那么我实际的建议是检查一下您正在做的事情。

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

答案3

我认为按照 Dan 的建议在 PowerShell 中设置环境变量[Environment]::SetEnvironmentVariable是没有意义的,因为如果您选择临时的“进程”上下文,则在 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 调用中的括号特殊字符的插入符号。

如果您从命令行而不是从批处理文件上下文中测试它,则需要%%用以下方式替换之前的变量引用%

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>

答案4

或者,如果您仍然习惯在旧 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

相关内容