gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:48:04 25 4
gpt4 key购买 nike

我的难题与以下链接中的问答帖有关: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 线程,在我看来,这是记录这种奇怪行为并在可能的情况下获得解释的合适位置,这可能有助于我和其他人以后更好地编写脚本。

最佳答案

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

wmic没有问题。问题在于您的批处理文件,其中包含两个 undefined variable )。

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

可能发生了什么:

你有 dowsource 卡在你的 cmd 环境中,你运行的另一个批处理文件不包含 setlocal 命令(防止变量泄漏到父 cmd shell 中)。

这意味着:

  • 如果在 的实例中设置了 dowsource,则从 cmd shell 运行的批处理文件将起作用命令

  • 从资源管理器中运行的批处理将无法运行,因为它会启动 cmd shell 和 dow 以及 source 的新实例未定义。

更正的批处理文件:

这是您的批处理文件的修改版本,当从 cmd shell 或 explorer 运行时可以正常工作,并正确设置星期几。

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

学分:


进一步阅读

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

关于windows - WMIC 在命令行和 Windows 资源管理器中的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38944969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com