Дата и время формата в сценарии пакетной обработки Windows

Для потомства я сделал что-то подобное zoul для приложений для iPhone, путем добавления revision.h к моему проекту, затем добавления следующего как фазы разработки Сценария Выполнения:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "#define kRevisionNumber @\"$REV\"" > ${PROJECT_DIR}/revision.h

я сделал это для захвата простого числа пересмотра, в противоположность более подробной строке, которую svnversion производит в решении zoul.

Для приложений Mac, я основывал свой подход к это сообщение , и вместо этого создал buildnumber.xcconfig файл. При настройках сборки для цели я изменился На основе значения в нижнем правом углу диалогового окна к buildnumber.xcconfig. В Info.plist я отредактировал следующие строки:

CFBundleVersion
${BUILD_NUMBER}
CFBundleShortVersionString
Version 1.0

Так, чтобы мой О диалоговом окне отобразил бы строку версии, подобную Версии 1.0 (1234), где 1234 является числом пересмотра Подрывной деятельности. Наконец, я создал фазу разработки Сценария Выполнения со следующим кодом:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

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

178
задан Community 23 May 2017 в 12:03
поделиться

6 ответов

Я закончил с этим скриптом:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%

:: Например, на WIN2008R2 мне нужно было сделать ваш 'set month =% date: ~ 3,2%', как показано ниже :: в противном случае появится 00 для МЕСЯЦА

set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

echo datetimef=%datetimef%
141
ответ дан 23 November 2019 в 20:13
поделиться

Смещение : форматирование длины , поддерживаемое командой SET в Windows, не позволит вам заполнить 0 , как вам кажется.

Однако вы можете закодировать ПАРТИЮ скрипт для проверки того, что час меньше 10 и
pad соответственно другой строкой echo .

Вы найдете некоторую информацию о команде SET по этой ссылке .


Вы также можете перейти на другие методы программирования, чтобы попасть сюда.

В unix bash (доступном с Cygwin в Windows) довольно просто сказать:

date +%Y_%m_%d__%H_%M_%S

И он всегда выполняет правильные вставки.

6
ответ дан 23 November 2019 в 20:13
поделиться

Следующее может не быть прямой ответ, но близкий?

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

По крайней мере, это может вдохновлять.

9
ответ дан 23 November 2019 в 20:13
поделиться
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%

PAUSE
70
ответ дан 23 November 2019 в 20:13
поделиться
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).

IF "%time:~0,1%" LSS "1" (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)

ECHO %DATETIME%
7
ответ дан 23 November 2019 в 20:13
поделиться

Как было отмечено, разбор даты и времени полезен только в том случае, если вы знаете формат, используемый текущим пользователем (например, MM/dd/yy или dd-MM-yyy, просто чтобы назвать два). Это можно определить, но после того, как вы сделаете все подчеркивания и разборы, вы все равно окажетесь в ситуации, когда используется неожиданный формат, и потребуется больше настроек.

Вы также можете использовать какую-нибудь внешнюю программу, которая будет возвращать строку даты в предпочитаемом вами формате, но это имеет недостатки, связанные с необходимостью распространять утилиту вместе с вашим скриптом/пакетом.

Существуют также пакетные трюки, использующие часы CMOS в довольно грубом виде, но это слишком близко к оголенным проводам для большинства людей, а также не всегда предпочтительное место для получения даты/времени.

Ниже представлено решение, которое позволяет избежать вышеуказанных проблем. Да, оно создает некоторые другие проблемы, но для моих целей я нашел это самое простое, понятное и портативное решение для создания метки даты в .bat-файлах для современных систем Windows. Это просто пример, но я думаю, вы поймете, как изменить его для других форматов даты и/или времени и т.д.

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f
20
ответ дан 23 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: