1

Я пытаюсь прочитать файл, который содержит дату в имени файла.

Проблема в том, что в системе используется формат даты США: mm/dd/yyyy он не работает.

Для этого формата: dd/mm/yyyy работает как положено.

Мне нужно получить дату в этом формате dd/mm/yyyy даже если система установлена в американском формате.

Я новичок в партии и не знаю, как получить дату в нужном формате.

Вот мой командный файл:

for /f "delims=/ tokens=1-3" %%a in ("%date%") do (
rem Lets name our new variable "rdate" for reverse date
set _date=%%a-%%b-%%c
)

set source=%path%.csv
echo %source%
set dest=%path%_%_date%.csv
echo %dest%

2 ответа2

2

Звучит как плохая идея разбирать дату, которая может быть в различных форматах, формат которых вы не знаете. Лучше получить дату в определенном формате, даже если это означает не чистую партию, а вызов PowerShell.

C:\Users\tod>for /f %a in ('C:\Windows\System32\WindowsPowershell\v1.0\powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%a

C:\Users\tod>set datetime=2018_01_22__09_15_33

или без времени.

C:\Users\tod>for /f %a in ('C:\Windows\System32\WindowsPowershell\v1.0\powershell -Command "Get-Date -format yyyy_MM_dd"') do set datetime=%a

C:\Users\tod>set datetime=2018_01_22

C:\Users\tod>

Как только у вас есть, что вы можете сделать

C:\Users\tod>echo %datetime:~0,4%
2018

C:\Users\tod>

И так далее.. Таким образом, вы можете установить любую переменную равной году, месяцу, дате в месяце.

добавленной

Если вы не хотите использовать powershell и не возражаете, это будет работать только для дат в США.

C:\Users\tod>echo %date%
01/22/2018

C:\Users\tod>echo %date:~0,2%
01

C:\Users\tod>echo %date:~3,2%
22

C:\Users\tod>echo %date:~6,4%
2018

C:\Users\tod>

Так что вы действительно должны видеть, как это сделать.

set first=%date:~0,2%

set second=%date:~3,2%

set third=%date:~6,4%


C:\Users\tod>set first=%date:~0,2%

C:\Users\tod>set second=%date:~3,2%

C:\Users\tod>set third=%date:~6,4%

C:\Users\tod>echo %first%/%second%/%third%
01/22/2018

C:\Users\tod>echo %second%/%first%/%third%
22/01/2018

C:\Users\tod>

Таким образом, вы можете сказать, set ukdate=%second%/%first%/%third% и вы можете сказать, echo %ukdate%

И этот не-PowerShell метод работает, только если вы знаете формат даты в системе и знаете, что это США. Я бы вообще рекомендовал против пакетной обработки, потому что, например, что, если новая ревизия ОС приходит и вывод команды немного отличается, и ваш код предполагает определенный формат при его разборе. И хотя в этом случае партия в некотором смысле опрятна, иногда она может походить на стучащие палочки. Хорошая идея - знать пакет и использовать его немного, но установить какой-либо другой язык сценариев, такой как Ruby или Python, Golang или NodeJS. Но если вы хотите использовать исключительно пакет для этого, то это так.

0

Как я могу получить дату в командном файле в независимом от локали формате?

Мне нужно отображаться с этим форматом дд / мм / гггг

Во-первых, чего не делать:

  • Использование %date% для предоставления решения, как используется в другом ответе, зависит от языкового стандарта ОС, региональных и языковых настроек и может предоставлять неверную или отсутствующую информацию.

  • Например, формат короткой даты на моем ПК вообще не выводит день недели.

Правильный способ решения проблемы:

  • Использование wmic , с другой стороны, работает независимо от локали ОС, языка или выбранного пользователем формата даты (панель управления / региональная).

Следующий пакетный файл использует wmic для получения даты и (локального) времени, поэтому не страдает недостатком решения, использующего %date% .

getdate.cmd:

@echo off
setlocal
rem get the date
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-3" %%g in (`wmic Path Win32_LocalTime Get Day^,Month^,Year ^| findstr /r /v "^$"`) do (
  set _day=00%%g
  set _month=00%%h
  set _year=%%i
  )
rem pad day and month with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
rem output format required is DD/MM/YYYY
echo %_day%/%_month%/%_year%
endlocal

Пример вывода:

> getdate
22/01/2018

Измените ваш пакетный файл, чтобы использовать приведенный выше код, например:

@echo off
setlocal
rem get the date
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-3" %%g in (`wmic Path Win32_LocalTime Get Day^,Month^,Year ^| findstr /r /v "^$"`) do (
  set _day=00%%g
  set _month=00%%h
  set _year=%%i
  )
rem pad day and month with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
rem output format required is DD/MM/YYYY
set source=%path%.csv
echo %source%
set dest=%path%_%_day%/%_month%/%_year%.csv
echo %dest%
endlocal

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

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

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