Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Команды в Win (date /T). Выбор формата даты. (http://forum.oszone.net/showthread.php?t=133770)

timur_m 04-03-2009 10:52 1054571

Команды в Win (date /T). Выбор формата даты.
 
Привет всем!
Такой вопрос, помогите разобраться, пожалуйста.
Ежедневно по крону отрабатывает bat-файл, который создаёт каталог с текущей датой:
mkdir c:\%DATE%
Как положено, появляется папочка c:\04.03.2009
На большинстве серверов (win2003) отрабатывает прекрасно, но попалась машина, которая вместо каталога с датой, создала:
c:\Ср
И действительно, в командной строке, команда: echo %DATE%, или DATE /T, выводит:
Ср 04.03.2009

В языковых стандарты (панели управления), формат даты указан, как dd.MM.yyyy.
Где указывается эта настройка? Подскажите пожалуйста, кто знает.

Petya V4sechkin 04-03-2009 11:26 1054591

timur_m, посмотрите параметр sShortDate в разделе реестра HKEY_CURRENT_USER\Control Panel\International. А если батник работает от имени SYSTEM, то в ветке HKEY_USERS\.DEFAULT\Control Panel\International.

gora 04-03-2009 13:08 1054682

Вот .bat файл для получения даты и времени независимо от региональных настроек на компьютере. Из текста видно, что формируются 7 переменных, которые можно использовать в любой удобной комбинации.
Код:

@echo off
:: Code by Herbert Kleebauer
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>d_t.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>d_t.com
echo LisqMz`wGH@wKuur`G@w?ogBgGG}G?j_egoNOG?w?`gBLksqgG`w?WgBgG>>d_t.com
echo G}G?R_MgoNMy?wSx@W?s?W?@zAB`LrFuBLyt~vuco{@LuKooD?BFHqrIcP>>d_t.com
echo _sdDxb1T??=?rILO_sdDqx1T??=?rILO_sdDnl1T??=?rILO_sdD`c1T??>>d_t.com
echo =?rILO_sdDgg1T??=?rILO_sdDll1T??=?rILO_sdDrr1T??=??IL?0xxx>>d_t.com

FOR /F "delims=" %%i IN ('d_t.com') DO %%i
del d_t.com

echo century: %_cy%
echo    year: %_yr%
echo  month: %_mo%
echo    day: %_da%
echo    hour: %_hh%
echo  minute: %_mm%
echo  second: %_ss%
echo    all: %_cy%%_yr%-%_mo%-%_da% %_hh%:%_mm%:%_ss%
echo.
echo                %DATE% %TIME%
pause>nul

Может пригодится.

Важно: создаваемый батником файл d_t.com является 16-разрядным приложением и не сможет работать на х64 ОС.

tr011_tmn 04-03-2009 21:19 1055081

gora,
а такой вопрос, имеется:
PHP код:

set D=%date:~0,2%
set M=%date:~3,2%
set Y=%date:~8,2%
set /a DD=%D% - 0
set 
/a MM=%M% - 0
set DT
=%DD%.%MM%.%Y

при использовании:
PHP код:

echo %DT

получаем:
4.3.09
если же ввести:
PHP код:

set /a YY=%Y% - 

то получаем:
Неправильное число. Числовые константы должны быть десятичными (17)
шестнадцатеричными (0x11),или восьмеричными (021).

То есть дату обрезать не получится, до результата 4.3.9?

gora 04-03-2009 21:27 1055084

tr011_tmn, так будет корректнее:
Код:

set D=1%date:~0,2%
set M=1%date:~3,2%
set Y=1%date:~8,2%
set /a DD=%D% - 100
set /a MM=%M% - 100
set /a YY=%Y% - 100
set DT=%DD%.%MM%.%YY%


tr011_tmn 04-03-2009 21:29 1055086

gora, только что проверил результат тот же
Неправильное число. Числовые константы должны быть десятичными (17)
шестнадцатеричными (0x11),или восьмеричными (021).

тем более используя:
Код:

set /a DD=%D% - 100
set /a MM=%M% - 100

получаем результаты

-96
-97

gora 04-03-2009 21:37 1055089

Цитата:

Цитата tr011_tmn
только что проверил результат тот же »

Вы не внимательны. Не увидели 1 в строках: set D=1%date:~0,2% Скопируйте мой текст и ошибок не будет.

tr011_tmn 04-03-2009 21:58 1055114

Цитата:

Цитата gora
Вы не внимательны. Не увидели 1 в строках: set D=1%date:~0,2% Скопируйте мой текст и ошибок не будет. »

приношу свои извинения и огромную благодарность.
не могли бы вы уточнить что означает 1 перед %%? исключительно ради любопытства. ведь если я правильно понял то мы добавляем знак перед %% и получаем значение 1%%. при %Y%, это 12009, или я что то не так понял?

gora 04-03-2009 22:06 1055121

Цитата:

Цитата tr011_tmn
что означает 1 перед %% »

Единица просто "приклеивается" спереди к переменной (не путать с математическим сложением).
Код:

set D=1%date:~0,2%
Если в %date:~0,2% имеем 04, то в переменной %D% будет 104.

Mersim 29-11-2015 18:48 2579877

Отнекрофилю тему :)
Давно уже собирался написать, но только, вот, руки дошли.

Чутка облагородить бы надо код:

Код:

REM Code by Herbert Kleebauer
(
    Echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=
    Echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6
    Echo LisqMz`wGH@wKuur`G@w?ogBgGG}G?j_egoNOG?w?`gBLksqgG`w?WgBgG
    Echo G}G?R_MgoNMy?wSx@W?s?W?@zAB`LrFuBLyt~vuco{@LuKooD?BFHqrIcP
    Echo _sdDxb1T??=?rILO_sdDqx1T??=?rILO_sdDnl1T??=?rILO_sdD`c1T??
    Echo =?rILO_sdDgg1T??=?rILO_sdDll1T??=?rILO_sdDrr1T??=??IL?0xxx
)>d_t.com

Именно REM, а не :: - вредно привыкать к неправильностям.
Глюки когда-нибудь вылезут из-за :: - застрелишься искать и догадываться :)

Присоветую еще заиметь папочку %SystemRoot%\_Add, которую указать в %Path%, и складывать в нее такие вот вкусняшки.
Тогда не надо будет создавать-удалять при каждом вызове. Как-то коряво это...
.

tarakan1983 24-12-2018 18:21 2848005

gora,
Цитата:

Может пригодится.
Важно: создаваемый батником файл d_t.com является 16-разрядным приложением и не сможет работать на х64 ОС.
А кто-нибудь что-то подобное для Х64 знает?

Iska 24-12-2018 19:09 2848016

Цитата:

Цитата tarakan1983
А кто-нибудь что-то подобное для Х64 знает? »

И для x86, и для x64:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq skip=1 delims=" %%i in (
        `wmic.exe OS get LocalDateTime`
) do for /f "tokens=1" %%j in ("%%~i") do (
        set sDateTime=%%j
        set sYear=!sDateTime:~0,4!
        set sMonth=!sDateTime:~4,2!
        set sDay=!sDateTime:~6,2!
        set sHour=!sDateTime:~8,2!
        set sMinute=!sDateTime:~10,2!
        set sSecond=!sDateTime:~12,2!
)

echo Year:  %sYear%
echo Month:  %sMonth%
echo Day:    %sDay%
echo Hour:  %sHour%
echo Minute: %sMinute%
echo Second: %sSecond%

endlocal
exit /b 0


megaloman 24-12-2018 19:51 2848020

Если извратить код Iska, чтобы без восклицаний:
Код:

@Echo Off
cls
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "sDateTime=%%d"

        set "sYear=%sDateTime:~0,4%"
        set "sMonth=%sDateTime:~4,2%"
        set "sDay=%sDateTime:~6,2%"
        set "sHour=%sDateTime:~8,2%"
        set "sMinute=%sDateTime:~10,2%"
        set "sSecond=%sDateTime:~12,2%"

        echo Year:  %sYear%
        echo Month:  %sMonth%
        echo Day:    %sDay%
        echo Hour:  %sHour%
        echo Minute: %sMinute%
        echo Second: %sSecond%
exit /b 0


alpap 25-12-2018 00:47 2848083

Код:

@echo off
for /f "tokens=1* delims==" %%a in ('"wmic path win32_localtime get Day,Month,Year,Hour,Minute,Second /value|find "^=""') do set "%%a=0%%b"

echo Year:  %Year:~-5%
echo Month:  %Month:~-3%
echo Day:    %Day:~-3%
echo Hour:  %Hour:~-3%
echo Minute: %Minute:~-3%
echo Second: %Second:~-3%
pause

(учтено добавление ведущего нуля на всякий случай кому вдруг надо)

fhrbc 05-02-2019 13:08 2856331

Вложений: 1
Утилита Файл 156364 (38.5 КБ) из комплекта UnxUtils
позволяет получить данные о дате времени в любом формате
независимо от региональных настроек.
Примеры использования:

Показать текущие ГГГГ-ММ-ДД
Код:

date.exe +"%%Y-%%m-%%d"
(%%y (строчная) - Краткий двузначный формат года)

Записать дату/время в переменную в нужном формате
Код:

for /f "tokens=*" %%i in ('date.exe +"%%Y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i
echo %timestamp%

Записать текущие значения даты/времени в переменные
Код:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in (
'date.exe +"%%Y,%%m,%%d,%%H,%%M,%%S"') do (
set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n)
echo %yy% %mo% %dd%

Записать значения даты/времени файла в переменные
Код:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in (
'date.exe -r test.txt +"%%Y,%%m,%%d,%%H,%%M,%%S"') do (
set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n)
echo %yy% %mo% %dd%

[+] Для сравнения значений переменных месяца, дня и т.д. необходимо удалить ведущие нули
Код:

for %%V in (%%m %%d) do (set /a %%V=1!%%V!-100)
Теперь не будет возникать ошибок при мат. операциях (set /a=...) с этими переменными

Iska 05-02-2019 17:30 2856375

fhrbc, для получения даты/времени в едином формате у нас уже есть Wbem (wmic.exe).

YuS_2 05-02-2019 17:53 2856383

Цитата:

Цитата Iska
для получения даты/времени в едином формате »

есть ещё интересные варианты... помимо wmic :)
Код не совсем мой, откуда стырена идея, уже не помню, но работает почти на всех windows:
Код:

@echo off
rem получаем дату в формате не зависящем от версии ОС
echo.>"%temp%\~.ddf"
>nul makecab /d RptFileName="%temp%\~.rpt" /d InfFileName="%temp%\~.inf" -f "%temp%\~.ddf"
for /f "tokens=4,5,6,7,8,9 delims=: " %%a in ('type "%temp%\~.rpt"') do (
        if not defined m call :month %%a
        if not defined current-date (call set "current-date=%%f-%%m%%-%%b")
        if not defined current-time (call set "current-time=%%c:%%d:%%e")
)
del /q "%temp%\~.*"
echo. "%current-date%" "%current-time%"
pause&exit

rem перевод формата MMM -> MM
:month
if "%1"=="Jan" set "m=01"
if "%1"=="Feb" set "m=02"
if "%1"=="Mar" set "m=03"
if "%1"=="Apr" set "m=04"
if "%1"=="May" set "m=05"
if "%1"=="Jun" set "m=06"
if "%1"=="Jul" set "m=07"
if "%1"=="Aug" set "m=08"
if "%1"=="Sep" set "m=09"
if "%1"=="Oct" set "m=10"
if "%1"=="Nov" set "m=11"
if "%1"=="Dec" set "m=12"
exit /b


Vadikan 05-02-2019 19:04 2856400

Все что угодно, лишь бы не изучать пошик
https://www.outsidethebox.ms/14845/#Get-Date

YuS_2 05-02-2019 19:21 2856402

Цитата:

Цитата Vadikan
Все что угодно, лишь бы не изучать пошик »

это да, такое злобное поделие микрософт вообще ни в коем случае нельзя изучать, оно изменит все законы мироздания и Земля закрутится в другую сторону... :)

Код:

'{0:g.yyyy.MM.dd HH:mm:ss}' -f (get-date)
Код:

PS_5.1> '{0:g.yyyy.MM.dd HH:mm:ss}' -f (get-date)
наша эра.2019.02.05 22:20:19
PS_5.1> powershell -v 2.0
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS_2.0> '{0:g.yyyy.MM.dd HH:mm:ss}' -f (get-date)
A.D..2019.02.05 22:22:32
PS_2.0>

:)

Iska 05-02-2019 20:10 2856407

YuS_2, а у меня на 5.1 и там, и там A.D. ;) (Windows 7 SP1 x64, CurrentCulture — 1049, ru-RU, Русский (Россия)):
Скрытый текст
Код:

PS C:\> powershell.exe -v 2.0
Windows PowerShell
(C) Корпорация Майкрософт, 2009. Все права защищены.

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1    -1


PS C:\> '{0:g.yyyy.MM.dd HH:mm:ss}' -f (Get-Date)
A.D..2019.02.05 20:06:09
PS C:\> exit
PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14409  1005


PS C:\> '{0:g.yyyy.MM.dd HH:mm:ss}' -f (Get-Date)
A.D..2019.02.05 20:06:23
PS C:\>


YuS_2 06-02-2019 07:54 2856471

Цитата:

Цитата Iska
и там, и там A.D. »

Ну, дык, учитывая тот зоопарк версий ОС, который развели в микрософт, немудрено, что они и сами в них путаются. :)
А вообще, тот код для наглядности, когда речь заходит про "единость" формата даты в powershell. Операционка ведь одна и та же, команда тоже одинаковая, а вот версии PS разные и как показывает практика, результаты, увы, бывают тоже разные. :)
У меня Win 10 LTSB ru

DJ Mogarych 07-02-2019 13:14 2856689

Powershell:
Код:

$d = get-date -UFormat "%d.%m.%Y"
mkdir c:\$d


Iska 07-02-2019 19:42 2856757

YuS_2, тут ещё что антиресно? Ежели, скажем, для какого-нибудь ЯВУ (наподобие C#, С++, VB.Net и иже с ними) тот факт, что метод вдруг начнёт возвращать какое-либо значение вместо void — оно как бы и не страшно: ну, вернул значение и вернул, подумаешь, оно никуда не присвоилось и кануло в лету. Но для PowerShell'а это не так — с его специфическим подходом «всё есть конвеер» — поскольку «всё, что не было куда-либо присвоено/передано — идёт в результат блока».

YuS_2 07-02-2019 22:29 2856773

Цитата:

Цитата Iska
поскольку «всё, что не было куда-либо присвоено/передано — идёт в результат блока». »

Не совсем понимаю о чем именно речь...
Если в конвейер передаётся объект с кучей свойств и параметров, то логично, что они передаются все...
Если же речь о том, что после выборки определенных параметров, в следующий конвейер передаются все не запрошенные свойства, то это не во всех случаях так. Но с другой стороны, это даже полезно, т.к. в цепочке конвейера, получаем возможность дернуть то, что может вдруг понадобиться... ведь искусственное ограничение передачи незапрошенных параметров, так или иначе будет ограничивать возможности составления кода. Но повторюсь, возможно, я не совсем правильно понял о чем речь...

fhrbc 08-02-2019 05:55 2856801

Цитата:

Цитата Iska
fhrbc, для получения даты/времени в едином формате у нас уже есть Wbem (wmic.exe). »

Если не затруднит, можно уточнить как получить в WMIC независимую от рег.настроек дату модификации файла, а то нигде не нашёл.
Текущую дату - да, а дату мод. файла - нет.
Приходится по прежнему использовать date.exe,
хотя она меня вполне устраивает, так как она делает и то и другое.

megaloman 08-02-2019 07:36 2856807

fhrbc,
Код:

@Echo Off                                                                                               
cls
        Set "Fin=Z:\Box_In\тра ля ля 1.txt"
        For /f "skip=1 tokens=2 delims=.," %%a in ('2^>nul wmic datafile where "name='%Fin:\=\\%%~nx1'" get 'Last Modified' /format:csv') Do Set "FModiDT=%%a"
        For /f "skip=1 tokens=2 delims=.," %%a in ('2^>nul wmic datafile where "name='%Fin:\=\\%%~nx1'" get 'CreationDate'  /format:csv') Do Set "FCreaDT=%%a"
        Echo Last Modified %FModiDT%
        Echo CreationDate  %FCreaDT%
pause
GoTo :Eof


Iska 10-02-2019 05:52 2857073

Цитата:

Цитата fhrbc
как получить в WMIC независимую от рег.настроек дату модификации файла, »

Точно так же (коллега megaloman уже сделал сие выше, я же просто напишу по аналогии с этим кодом), в качестве исходного файла выступает сам пакетный файл («set sSourceFile=%~f0»):
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~f0

for /f "usebackq skip=1 delims=" %%i in (
        `wmic.exe DataFile where "Name='%sSourceFile:\=\\%'" get LastModified`
) do for /f "tokens=1" %%j in ("%%~i") do (
        set sDateTime=%%j
        set sYear=!sDateTime:~0,4!
        set sMonth=!sDateTime:~4,2!
        set sDay=!sDateTime:~6,2!
        set sHour=!sDateTime:~8,2!
        set sMinute=!sDateTime:~10,2!
        set sSecond=!sDateTime:~12,2!
)

echo Source file: [%sSourceFile%]
echo --- LastModified ---
echo Year:  %sYear%
echo Month:  %sMonth%
echo Day:    %sDay%
echo Hour:  %sHour%
echo Minute: %sMinute%
echo Second: %sSecond%

endlocal
exit /b 0



Время: 20:40.

Время: 20:40.
© OSzone.net 2001-