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

Tim*_*Tim 62 powershell batch windows-command-prompt

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

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

C:\Users\tisc> powershell (get-date).dayofweek
Friday
Run Code Online (Sandbox Code Playgroud)

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

C:\Users\tisc> set dow = powershell (get-date).dayofweek
Run Code Online (Sandbox Code Playgroud)

但是当我试图得到它时,我没有得到我想要的字符串。

C:\Users\tisc> set dow
DoW=0
dow = powershell (get-date).dayofweek
Run Code Online (Sandbox Code Playgroud)

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

Ion*_*rel 91

您可以使用以下内容:

$env:DOW = "foo"
Run Code Online (Sandbox Code Playgroud)

  • @IonTodirel 因为这只存在于进程空间中。 (14认同)
  • 我不明白为什么这被标记为负面,你知道设置环境变量更好吗? (3认同)
  • +1 在我需要的场景中,这对我很有用。`PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')` (2认同)
  • 这并没有告诉我如何设置_命令的输出_ (2认同)

Dan*_*Dan 22

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

IE:

$dow = (get-date).dayofweek
[Environment]::SetEnvironmentVariable("DOW", $dow, "Machine")
Run Code Online (Sandbox Code Playgroud)

或者

[Environment]::SetEnvironmentVariable("DOW", $dow, "User")
Run Code Online (Sandbox Code Playgroud)

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

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

创建和修改环境变量

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

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

要么使用 PowerShell 完成整个过程,要么考虑使用计划任务?您可以根据一周中的哪一天安排任务。


the*_*bit 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>
Run Code Online (Sandbox Code Playgroud)

您可以使用该for命令作为解决方法来解析 PowerShell 命令的输出并将其放入变量中:

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

请注意^用于在 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>
Run Code Online (Sandbox Code Playgroud)