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