WMIC在命令行和Windows资源管理器中的不同行为

时间:2016-08-14 17:51:06

标签: windows batch-file

我的难题与以下链接中的q / a线程有关:How to append date to directory path in xcopy

我是这个论坛的新手,我有同样的问题,而且我使用的是Windows 10,所以我使用foxidrive中关于如何使用WMIC的线程给出的答案,除了一个我还没想到的问题外,它的工作非常棒......

我修改了foxidrive提供的脚本,如下所示:

@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set datestamp=%dt:~0,8%
set timestamp=%dt:~8,6%
set YYYY=%dt:~0,2%
set YY=%dt:~2,2%
set MM=%dt:~4,2%
set DD=%dt:~6,2%
set HH=%dt:~8,2%
set Min=%dt:~10,2%
set Sec=%dt:~12,2%
for /f "tokens=%dow%" %%a in ("Su Mo Tu We Th Fr Sa") do set day=%%a

set stamp=%YY%%MM%%DD%%HH%%Min%%day%

REM echo Today is %day%.

md "%stamp%MoreDirName"
xcopy %source% /E /y .\"%stamp%MoreDirName"

当我从cmd.exe运行批处理文件时,我得到了所需的结果,即,使用我想要的日期格式创建目录,并且我想要的日期和时间戳包括名称一周中的天。但是,当我在Windows资源管理器中双击批处理文件时,将创建该文件夹并复制文件夹/文件,但新文件夹名称中不会显示星期几的名称。我对此行为感到困惑,我想知道如何覆盖它。

我会更多地研究这个问题,但我不知道除了“命令行和窗口中的WMIC的不同行为”之外还要搜索什么,这样的搜索没有产生任何有用的结果。但由于我的努力是基于引用的堆栈交换q / a线程,在我看来,这是一个适当的地方来记录这种奇怪的行为并在可能的情况下得到解释,这可能有助于我和其他人以后更好地撰写脚本。

1 个答案:

答案 0 :(得分:2)

我对此行为感到困惑,我想知道如何覆盖它

wmic没有问题。问题在于您的批处理文件,其中包含两个未定义的变量。)

for /f "tokens=%dow%" %%a in ("Su Mo Tu We Th Fr Sa") do set day=%%a

您不要在批处理文件中的任何位置设置dow

xcopy %source% /E /y .\"%stamp%MoreDirName"

您也不要在批处理文件中的任何位置设置source

可能发生的事情:

您的dow环境中有sourcecmd来自您运行的另一个不包含setlocal命令的批处理文件(这可防止变量泄漏到cmdcmd shell)。

这意味着:

  • 如果在dow的实例中设置了sourcecmd,那么从cmd shell运行的批处理文件将起作用。

  • 从资源管理器运行的批处理无效,因为它启动了dow shell的新实例,而sourcecmd未定义。

更正了批处理文件:

以下是批处理文件的修改版本,该文件在从explorer shell或rem @echo off setlocal set source=SomeSourceValue rem use findstr to strip blank lines from wmic output for /f "usebackq skip=1 tokens=1-6" %%g in (`wmic Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year ^| findstr /r /v "^$"`) do ( set _day=00%%g set _hours=00%%h set _minutes=00%%i set _month=00%%j set _seconds=00%%k set _year=%%l ) rem pad with leading zeros set _month=%_month:~-2% set _day=%_day:~-2% set _hh=%_hours:~-2% set _mm=%_minutes:~-2% set _ss=%_seconds:~-2% rem get day of the week for /f %%k in ('powershell ^(get-date^).DayOfWeek') do ( set _dow=%%k ) set _stamp=%_year%%_month%%_day%%_hh%%_mm%%_dow:~0,2% md "%_stamp%MoreDirName" xcopy %source% /E /y .\"%_stamp%MoreDirName" endlocal 运行时正常工作,并正确设置星期几。

wmic

注意:

  • 批处理文件使用更优雅的方式从source检索时间戳组件。
  • 根据需要修改上述内容以正确设置public static <T extends Object> ListIterator<T> createListIterator(ListIterator<T> o) { return new ListIteratorAdaptor<T>(o); }

现金:

进一步阅读

  • An A-Z Index of the Windows CMD command line - 与Windows cmd相关的所有内容的绝佳参考。
  • for /f - 针对另一个命令的结果循环命令。
  • getdate - 显示与操作系统区域设置,语言或用户选择的日期格式无关的日期和时间(控制面板/区域)。
  • setlocal - 设置选项以控制批处理文件中环境变量的可见性。
  • variables - 提取变量(子串)的一部分。
  • wmic - Windows Management Instrumentation命令。