Как получить формат даты в пакетном файле Windows как «ггггммдд»? - PullRequest
0 голосов
/ 28 мая 2018

Я пишу Windows Batch-файл, а batch file должен выводить файл в определенную папку.Я хочу, чтобы имя файла было записано следующим образом:

filename-yyyymmdd.csv

где yyyymmdd обозначает текущую дату.

Мои batch file коды обозначаются следующим образом:

cd:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn
bcp "SELECT TOP 100 * FROM xxxx.dbo.xxxxx" queryout c:\test\csv\confirmed.csv -t, -c -S xxxx\xxxxx -U xxx -P xxxxxxxxxx
set mydate=%date:~10,4%%date:~4,2%%date:~7,2%
echo %mydate%
copy c:\test\csv\confirmed.csv c:\test\csvwithdates\confirmed-%mydate%.csv

Я получаю следующее имя файла в качестве вывода: confirmed-ay18.csv

Требуемый вывод: confirmed-20180528.csv

Я посмотрел следующие вопросы по StackOverflow, но у меня возникли трудностиРеализация предложенных ответов:

Получить дату в формате ГГГГММДД в ​​пакетном файле Windows

Пакет Windows: дата в формате

Что я делаю не так?

1 Ответ

0 голосов
/ 29 мая 2018

Динамическая переменная среды DATE предоставляет текущую локальную дату в формате, зависящем от региона, т. Е. В соответствии со страной, заданной в параметрах региона и языка Windows для используемой учетной записи.Статья Википедии Формат даты по стране перечисляет различные форматы даты, используемые в странах по всему миру.

Поэтому необходимо запускать с учетной записью, используемой для запуска пакетного файла, в командной строкеокно echo %DATE% и посмотрите строку выходной даты.

Начинается ли выходная дата с сокращенного дня недели или дата выводится без дня недели?Первый выходной день и следующий месяц с цифрами или первый выходной месяц и следующий день?Месяц выводится как число или с именем?День месяца или месяц со значением меньше 10 выводится с начальным 0 и поэтому всегда с двумя цифрами или только с одной цифрой?

Очень распространенная командная строка для изменения строки даты, зависящей от региона, в формате..., DD.MM.YYYY с . или / или любым другим символом-разделителем для YYYYMMDD:

set "LocalDate=%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%"

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

Для строки даты, зависящей от региона ..., MM/DD/YYYY используемая командная строка:

set "LocalDate=%DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%"

Какую подстановку строки необходимо выполнить, можно легко определить, выполнив команды в командеокно запроса с использованием команды ECHO вместо SET :

echo %DATE%
echo %DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%
echo %DATE:~-4%%DATE:~-10,2%%DATE:~-7,2%

См. также Что означает% date: ~ -4,4 %% date:~ -10,2 %% дата: ~ -7,2% _% время: ~ 0,2 %% время: ~ 3,2% среднее?

Преимущество использования динамической переменной средыDATE - это скорость, поскольку подстановка строк выполняется командным процессором Windows ve.очень быстроНедостатком является изменяющийся формат даты из-за зависимости региона / страны.

Независимое от региона решение использует команду WMIC , как показано ниже:

for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "LocalDate=%%I"
set "LocalDate=%LocalDate:~0,8%"

WMIC всегда выводит строку даты в формате ГГГГММДДЧЧммSS.microsecond ± UTC независимо от того, какая страна настроена и какой формат даты установлен для страны.

Недостаток использования WMIC заключается в том, чтовремя, необходимое для выполнения, так как для вывода строки даты требуется более секунды, закодированный в формате UTF-16 Little Endian, обработанный следующей командой FOR .

См. ответ по % date%выдает другой результат в командном файле при запуске из запланированных задач на сервере 2016 для очень подробного объяснения того, как эти две командные строки работают при выполнении командным процессором Windows cmd.exe.

Полный пакетный файл:

@echo off
cd /D "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn"
bcp.exe "SELECT TOP 100 * FROM xxxx.dbo.xxxxx" queryout C:\test\csv\confirmed.csv -t, -c -S xxxx\xxxxx -U xxx -P xxxxxxxxxx
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "LocalDate=%%I"
set "LocalDate=%LocalDate:~0,8%"
copy /Y C:\test\csv\confirmed.csv C:\test\csvwithdates\confirmed-%LocalDate%.csv
set "LocalDate="

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

  • cd /?
  • copy /?
  • echo /?
  • for /?
  • set /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...