2

Я использую эту команду в командном файле, чтобы добавить метку времени в файл:

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

2 ответа2

0

Работает нормально на обоих серверах, но разные выходы

Попробуйте следующий пакетный файл (который является правильным способом для анализа местного времени, выводимого из 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 означает, что объект не может быть найден. В частности, это подсистема COM/OLE для WMI (она же WBEM), которая жалуется, что не может найти запрошенный класс или значение WMI.

Решение состоит в том, чтобы исправить хранилище WMI:

Как исправить отсутствующее или поврежденное хранилище WMI

Чтобы исправить поврежденный репозиторий WMI, сначала запустите проверку диска (chkdsk), чтобы убедиться, что повреждение не на уровне хранилища. D'эм. Затем убедитесь, что оснастке WMI Control действительно сложно подключиться к WMI; он должен жаловаться на «Не удалось инициализировать все необходимые классы WMI»:

Затем выберите один из трех видов исправлений для поврежденных репозиториев WMI: простой, грязный или страшный:

  • Просто: запустите winmgmt /salvagerepository в локальном хранилище WMI
  • Sordid: восстановить репозиторий WMI из резервной копии WMI (если есть)
  • Страшно: переустановить Windows с аварийного диска

Source Chef в Windows - обнаружение и устранение проблем WMI, которые мешают запуску chef-client


Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • for /f - Циклическая команда против результатов другой команды.
  • getdate - отображает дату и время независимо от локали ОС, языка или выбранного пользователем формата даты (панель управления / региональная).
  • переменные - извлечение части переменной (подстроки).
  • wmic - команда инструментария управления Windows.
0

Я думаю, что проблема не связана с пакетом, который использует Мухаммед.

Утверждение DavidPostill (which is the correct way to parse the local time output from wmic) по крайней мере сомнительно. Там нет одного правильного пути. IMO бесполезно получать отдельные элементы даты / времени и заполнять ведущие нули впоследствии.

Вы получите такой же ошибочный вывод, если var 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

Эхо в последней строке позволяет избежать ошибок при тестировании, удаляйте его, когда вывод выглядит нормально.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .