在 Win Server 2008 R2 上使用时间戳时批处理文件不起作用

在 Win Server 2008 R2 上使用时间戳时批处理文件不起作用

我在批处理文件中使用此命令在文件上添加时间戳:

copy C:\1\1.txt C:\1\Log_%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%.%time:~3,2%.%time:~6,2%.txt

它在 Windows Server 2008 R2 上运行良好,但它无法在具有相同操作系统(2008 R2)的其他设备上运行。

我尝试了另一个脚本:

@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set YYYY=%dt:~0,4%
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%
set stamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%
copy "C:\1\1.txt" "C:\1\Log_ %stamp%.txt

它在两台服务器上运行良好,但输出不同:

有问题的服务器:

Log_ ~0,4-~4,2-~6,2_~8,2-~10,2-~12,2.txt 

其他服务器:

Log_ 2017-06-04_12-50-07.txt

答案1

它在两台服务器上运行良好,但输出不同

尝试以下批处理文件(这是解析本地时间输出的正确方法wmic):

@echo off
setlocal
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%
set _stamp=%_year%%_month%%_day%%_hh%%_mm%%_ss%
copy "C:\1\1.txt" "C:\1\Log_ %_stamp%.txt"
endlocal

此代码在特定服务器上仍然失败,错误代码为 0x80020009

Z:\>wmic Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year ERROR: Code = 0x80020009 Description = Exception occurred. Facility = Dispatch

错误代码 80041002 表示故障机器上缺少或损坏的 wmi 存储库。

此处解决问题的关键是错误代码 80041002,它在 WMI 术语中意味着无法找到对象。具体来说,这是 WMI(又名 WBEM)的 COM/OLE 子系统抱怨它找不到请求的 WMI 类或值。

解决方案是修复 WMI 存储库:

如何修复丢失或损坏的 WMI 存储库

为了修复损坏的 WMI 存储库,首先运行磁盘检查 ( chkdsk) 以确保损坏不在存储级别。呃。接下来,检查 WMI 控制管理单元确实难以连接到 WMI;它应该抱怨“无法初始化所有必需的 WMI 类”:

在此处输入图片描述

然后选择以下三种修复方法之一来修复损坏的 WMI 存储库:简单、肮脏或可怕:

  • 简单:winmgmt /salvagerepository针对本地 WMI 存储库运行
  • Sordid:从 WMI 备份恢复 WMI 存储库(如果有)
  • 可怕:从救援盘重新安装 Windows

来源Windows 上的 Chef – 检测并修复阻止 chef-client 运行的 WMI 问题


进一步阅读

  • Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
  • 对于/f- 循环命令以执行另一个命令的结果。
  • 获取日期- 显示独立于操作系统区域设置、语言或用户选择的日期格式(控制面板/区域)的日期和时间。
  • 变量- 提取变量的一部分(子字符串)。
  • 西米克- Windows 管理规范命令。

答案2

我认为问题与穆罕默德使用的批次无关。

DavidPostill 的断言(which is the correct way to parse the local time output from wmic)至少值得怀疑。没有正确的方法。在我看来,获取单个日期/时间元素并在之后填充前导零是没有意义的。

如果变量dt不是定义。因此要么

  • 将批次传输到其他服务器时出错,或者
  • 因为单行也会因内部变量而失败%date%,所以所涉及的路径%time%可能是错误的。cmd.exe

在组装之前,无需将日期/时间元素放入变量中stamp

@Echo off
For /f "delims=." %%D in ('wmic OS Get localdatetime ^| find "."') Do "Set dt=%%D"
Set stamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%
Echo copy "C:\1\1.txt" "C:\1\Log_%stamp%.txt

最后一行中的 Echo 可避免测试时出现错误,当输出看起来正常时将其删除。

相关内容