【问题标题】:zero pad wmic output inside for loop of batch file批处理文件的for循环内的零填充wmic输出
【发布时间】:2015-05-21 13:25:31
【问题描述】:

我认为下面的批处理文件不需要enableDelayedExpansion,但不知怎的,我忽略了 for 循环内嵌套 if/else 树的问题。

我已使用 :: 评论了预期的操作。

它进入“前置 0”(当 %%b 为空时,我预计小于 10)或“无前置”子句。

鉴于此批处理文件:

  setlocal enableDelayedExpansion
  for /F "tokens=1,2 delims==" %%a IN ('wmic path Win32_LocalTime get * /format:list ^| findstr "="' ) do (
    echo wmic_%%a=%%b
    if "%%b"=="" (
      :: empty becomes 00
      set wmic_%%a=00
    ) else (
    if %%b LSS 10 (
        :: 0 prepend
        set wmic_%%a=0%%b
      ) else (
        :: no prepend
        set wmic_%%a=%%b
      )
    )
  )
  set | findstr "wmic_"
  endlocal

wmic 语句给出如下列表:

Day=21
DayOfWeek=4
Hour=15
Milliseconds=
Minute=4
Month=5
Quarter=2
Second=22
WeekInMonth=4
Year=2015

我想把它扩展成这样:

wmic_Day=21
wmic_DayOfWeek=04
wmic_Hour=15
wmic_Milliseconds=00
wmic_Minute=02
wmic_Month=05
wmic_Quarter=02
wmic_Second=22
wmic_WeekInMonth=04
wmic_Year=2015

但我得到了像这样的非零扩展变量:

wmic_Day=21
wmic_DayOfWeek=4
wmic_Hour=15
wmic_Milliseconds=0
wmic_Minute=2
wmic_Month=5
wmic_Quarter=2
wmic_Second=22
wmic_WeekInMonth=4
wmic_Year=2015

【问题讨论】:

  • :: 在技术上是一个标签,它有破坏for 循环和if 语句内部的东西的历史。请改用rem
  • 没有标签我得到相同的结果。

标签: windows variables batch-file for-loop


【解决方案1】:

我同意SomethingDark。 :: 不应在括号内的代码块中使用。

另外,我认为部分问题在于从 WMI 查询返回的值的编码是在 UCS-2 Little Endian 中编码的,这对 ANSI 运行时产生了奇怪的影响。我找到了一种解决方法,使用set /a,将.0 附加到每个值(立即删除,因为set /a 只计算整数)和黑洞错误消息。

@echo off
setlocal enabledelayedexpansion

for /f "delims=" %%I in ('wmic path win32_localtime get * /format:list ^| findstr "="') do (
    2>NUL set /a "wmic_%%I.0"
)
for /f "tokens=1,2 delims==" %%I in ('set wmic_') do (
    if %%J leq 9 set "%%I=0%%J"
)

set wmic_

它很丑,但它似乎产生了你想要的输出。我猜,目的是证明手段的合理性。 :)

【讨论】:

  • 你是对的。在所有作业周围添加 () 并发现虚假的换行符。
猜你喜欢
  • 2021-05-12
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2011-10-07
  • 2023-04-08
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多