我在批处理文件中使用此命令在文件上添加时间戳:
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 可避免测试时出现错误,当输出看起来正常时将其删除。