Geçerli tarihi YYYY-AA-GG formatında bir Windows .bat dosyasındaki bazı değişkenlere nasıl kaydedebilirim?
Unix kabuk analogu:
today=`date +%F`
echo $today
Geçerli tarihi YYYY-AA-GG formatında bir Windows .bat dosyasındaki bazı değişkenlere nasıl kaydedebilirim?
Unix kabuk analogu:
today=`date +%F`
echo $today
Yanıtlar:
Geçerli tarihi yerel ayardan bağımsız bir şekilde alabilirsiniz.
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
Daha sonra alt dizeleri kullanarak tek tek parçaları çıkarabilirsiniz:
set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%
Tek tek parçaları içeren değişkenleri almanın başka bir yolu da şudur:
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
Değişken ad alanınızı kirletme pahasına, alt dizelerle uğraşmaktan çok daha iyi.
Yerel saat yerine UTC'ye ihtiyacınız varsa, komut aşağı yukarı aynıdır:
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
for /f
İkincisi boş olan iki satır döndürdüğü için bu gereklidir . Bunu arada kullanarak çözebilirsiniz set MyDate=
. Sanırım user2023861 bunun üzerine tökezledi.
Year
, Month
, Day
, Hour
, Minute
, Second
, Quarter
, WeekInMonth
,DayOfWeek
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day%
geçersiz cevap: bir basamaklı ay ve gün döndürür . Sıfır ay ve gün başından bugüne dizesi ile 2 basamaklı sol dolgulu nasıl elde edilir?
Bunu bir toplu iş dosyasında standart MS-DOS komutlarını kullanarak elde etmek istiyorsanız, şunları kullanabilirsiniz:
FOR /F "TOKENS=1 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET dd=%%A
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2,3 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET yyyy=%%C
Bunun daha da geliştirilebileceğinden eminim, ancak bu, tarihi Gün (gg), Ay (mm) ve Yıl (yyyy) için 3 değişkene verir. Daha sonra bunları toplu komut dosyanızda gerektiği gibi kullanabilirsiniz.
SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%
Bu soru için bir cevabın kabul edildiğini anlasam da, bu alternatif yöntem WMI konsolunu kullanmadan bunu başarmak isteyen birçok kişi tarafından takdir edilebilir, bu yüzden bu soruya bir miktar değer katacağını umuyorum.
date /T
Biçimi komut isteminde bulmak için kullanın .
Tarih formatı şu şekilde Thu 17/03/2016
kullanılırsa:
set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%
SELECT CONVERT(VARCHAR(16), GETDATE(), 112)
" gibi görünüyor.
%date:~10,4%%date:~7,2%%date:~4,2%T%time:~0,2%%time:~3,2%%time:~6,2%
Zaman ayarlarına bağlı olmayan iki yol daha (her ikisi de Verileri nasıl alır / yerelleştirmeden bağımsız zaman bölümünden alınır ). Her ikisi de haftanın gününü alır ve hiçbiri yönetici izni gerektirmez !:
MAKECAB - HER Windows sisteminde çalışır (hızlı, ancak küçük bir geçici dosya oluşturur) (foxidrive betiği):
@echo off
pushd "%temp%"
makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
set "current-date=%%e-%%b-%%c"
set "current-time=%%d"
set "weekday=%%a"
)
del ~.*
popd
echo %weekday% %current-date% %current-time%
pause
ROBOCOPY - Windows XP ve Windows Server 2003 için yerel bir komut değildir , ancak Microsoft sitesinden indirilebilir . Ancak Windows Vista ve üzeri her şeyde yerleşiktir:
@echo off
setlocal
for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
set "dow=%%D"
set "month=%%E"
set "day=%%F"
set "HH=%%G"
set "MM=%%H"
set "SS=%%I"
set "year=%%J"
)
echo Day of the week: %dow%
echo Day of the month : %day%
echo Month : %month%
echo hour : %HH%
echo minutes : %MM%
echo seconds : %SS%
echo year : %year%
endlocal
Ve diğer Windows komut dosyası dillerini kullanan üç yol daha. Size daha fazla esneklik sağlarlar, örneğin yılın haftasını, milisaniye cinsinden zamanı vb. Alabilirsiniz.
JScript / BATCH hibrit (olarak kaydedilmesi gerekir .bat
). JScript, Windows NT ve üzeri her sistemde , Windows Script Host'un bir parçası olarak mevcuttur ( ancak kayıt defteri aracılığıyla devre dışı bırakılabilir, bu nadir bir durumdur ):
@if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
@echo off
cscript //E:JScript //nologo "%~f0"
exit /b 0
*------------------------------------------------------------------------------*/
function GetCurrentDate() {
// Today date time which will used to set as default date.
var todayDate = new Date();
todayDate = todayDate.getFullYear() + "-" +
("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
("0" + todayDate.getMinutes()).slice(-2);
return todayDate;
}
WScript.Echo(GetCurrentDate());
VBScript / BATCH hibrit ( VBScript'i geçici bir dosya kullanmadan bir toplu iş dosyasına gömmek ve yürütmek mümkün müdür? ) Jscript ile aynı durumdur, ancak hibridizasyon o kadar mükemmel değildir:
:sub echo(str) :end sub
echo off
'>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
'& echo current date:
'& cscript /nologo /E:vbscript "%~f0"
'& exit /b
'0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
'1 = vbLongDate - Returns date: weekday, monthname, year
'2 = vbShortDate - Returns date: mm/dd/yy
'3 = vbLongTime - Returns time: hh:mm:ss PM/AM
'4 = vbShortTime - Return time: hh:mm
WScript.echo Replace(FormatDateTime(Date, 1), ", ", "-")
PowerShell - .NET'e sahip her makineye yüklenebilir - Microsoft'tan indirme ( v1 , v2 ve v3 (yalnızca Windows 7 ve üzeri için)). Windows 7 / Win2008 ve üstü her şeye varsayılan olarak yüklenir:
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
Kendi kendine derlenmiş jscript.net/batch (.NET içermeyen bir Windows makinesi hiç görmedim, bu yüzden bunun oldukça taşınabilir olduğunu düşünüyorum):
@if (@X)==(@Y) @end /****** silent line that start jscript comment ******
@echo off
::::::::::::::::::::::::::::::::::::
::: Compile the script ::::
::::::::::::::::::::::::::::::::::::
setlocal
if exist "%~n0.exe" goto :skip_compilation
set "frm=%SystemRoot%\Microsoft.NET\Framework\"
:: searching the latest installed .net framework
for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
if exist "%%v\jsc.exe" (
rem :: the javascript.net compiler
set "jsc=%%~dpsnfxv\jsc.exe"
goto :break_loop
)
)
echo jsc.exe not found && exit /b 0
:break_loop
call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
::::::::::::::::::::::::::::::::::::
::: End of compilation ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation
"%~n0.exe"
exit /b 0
****** End of JScript comment ******/
import System;
import System.IO;
var dt=DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
Logman Bu, haftanın yılını ve gününü alamaz. Nispeten yavaştır, ayrıca bir geçici dosya oluşturur ve logman'ın günlük dosyalarına koyduğu zaman damgalarına dayanır. Windows XP ve üzeri her şeyi çalıştıracak. Muhtemelen hiç kimse tarafından kullanılmayacak - ben dahil - ama bir yolu daha ...
@echo off
setlocal
del /q /f %temp%\timestampfile_*
Logman.exe stop ts-CPU 1>nul 2>&1
Logman.exe delete ts-CPU 1>nul 2>&1
Logman.exe create counter ts-CPU -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
Logman.exe start ts-CPU 1>nul 2>&1
Logman.exe stop ts-CPU >nul 2>&1
Logman.exe delete ts-CPU >nul 2>&1
for /f "tokens=2 delims=_." %%t in ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
echo %timestamp%
echo MM: %timestamp:~0,2%
echo dd: %timestamp:~2,2%
echo hh: %timestamp:~4,2%
echo mm: %timestamp:~6,2%
endlocal
exit /b 0
Get-Date işlevi hakkında daha fazla bilgi .
Joey'nin yöntemini gerçekten beğendim, ama biraz daha açabileceğimi düşündüm.
Bu yaklaşımda, kodu birden çok kez çalıştırabilir ve eski tarih değerinin "takılıp kalması" konusunda endişelenmeyin çünkü zaten tanımlanmıştır.
Bu toplu iş dosyasını her çalıştırdığınızda, ISO 8601 uyumlu birleşik bir tarih ve saat temsili çıktı verecektir.
FOR /F "skip=1" %%D IN ('WMIC OS GET LocalDateTime') DO (SET LIDATE=%%D & GOTO :GOT_LIDATE)
:GOT_LIDATE
SET DATETIME=%LIDATE:~0,4%-%LIDATE:~4,2%-%LIDATE:~6,2%T%LIDATE:~8,2%:%LIDATE:~10,2%:%LIDATE:~12,2%
ECHO %DATETIME%
Bu sürümde, aynı kodu dosyadaki birden çok yere kopyalamamaya / yapıştırmamaya dikkat etmelisiniz, çünkü bu, yinelenen etiketlere neden olur. Ya her kopya için ayrı bir etiketiniz olabilir ya da bu kodu kendi toplu iş dosyasına koyabilir ve gerektiğinde kaynak dosyanızdan çağırabilirsiniz.
@ProVi'nin cevabına göre, istediğiniz biçimlendirmeye uyacak şekilde değiştirin
echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
dönecek
yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11
DÜZENLE @Jeb yorumuna göre, yukarıdaki saat formatı yalnızca DATE / T komutunuz döndüğünde çalışacaktır.
ddd dd/mm/yyyy
Thu 17/09/2015
Yerel ayarlarınıza uyacak şekilde düzenlemek kolaydır, ancak, ilgili% DATE% ortam değişkeni tarafından döndürülen dizedeki her karakterin indekslenmesini kullanarak, ihtiyacınız olan dizenin parçalarını çıkarabilirsiniz.
Örneğin. % DATE ~ 10,4% kullanılması, DATE ortam değişkenini genişletir ve sonra yalnızca genişletilmiş sonucun 11. (ofset 10) karakterinde başlayan 4 karakteri kullanır
Örneğin, ABD tarzı tarihler kullanılıyorsa, aşağıdakiler geçerlidir
ddd mm/dd/yyyy
Thu 09/17/2015
echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
2015-09-17 18:36:11
Bunu kontrol et..
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & 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 "MS=%dt:~15,3%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
Python yüklediyseniz şunları yapabilirsiniz:
python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"
Biçim dizesini ihtiyaçlarınıza göre kolayca uyarlayabilirsiniz.
python -c "import datetime;print(datetime.date.today())"
çünkü __str__
yöntemi date
sınıfının sadece çağırır isoformat()
.
PowerShell'i kullanmak ve çıktısını bir döngü kullanarak bir ortam değişkenine yönlendirmek mümkündür.
Komut satırından ( cmd
):
for /f "tokens=*" %a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%a
echo %td%
2016-25-02+17:25
Bir toplu dosyada kaçabileceği %a
olarak %%a
:
for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%%a
FOR /F "tokens=*" %%a IN ('powershell get-date -format "{yyyy\-MM\-dd\THH\:mm\:ss}"') DO SET date=%%a
şekilde olmalıdır, bu nedenle ay için üst MM ve değişmez karakterlerden kaçınmak için ters eğik çizgi kullanın.
Tarih ve saat biçimi konuma özgü bilgiler olduğundan, bunları% date% ve% time% değişkenlerinden almak, dizeyi biçim dönüşümü dikkate alınarak ayrıştırmak için fazladan çaba gerektirecektir. Veri yapısını almak ve istediğiniz gibi ayrıştırmak için biraz API kullanmak iyi bir fikirdir. WMIC iyi bir seçimdir. Aşağıdaki örnek Win32_LocalTime kullanır . Win32_CurrentTime veya Win32_UTCTime'ı da kullanabilirsiniz .
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%x in ('wmic path Win32_LocalTime get /format:list ^| findstr "="') do set %%x
set yyyy=0000%Year%
set mmmm=0000%Month%
set dd=00%Day%
set hh=00%Hour%
set mm=00%Minute%
set ss=00%Second%
set ts=!yyyy:~-4!-!mmmm:~-2!-!dd:~-2!_!hh:~-2!:!mm:~-2!:!ss:~-2!
echo %ts%
ENDLOCAL
Sonuç:
2018-04-25_10: 03: 11
Bu, Joey'nin zamanı dahil etme ve bölümleri 0'larla doldurma yanıtının bir uzantısıdır.
Örneğin, sonuç 2019-06-01_17-25-36 olacaktır. Ayrıca, bunun UTC zamanı olduğunu unutmayın.
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set Month=0%Month%
set Month=%Month:~-2%
set Day=0%Day%
set Day=%Day:~-2%
set Hour=0%Hour%
set Hour=%Hour:~-2%
set Minute=0%Minute%
set Minute=%Minute:~-2%
set Second=0%Second%
set Second=%Second:~-2%
set TimeStamp=%Year%-%Month%-%Day%_%Hour%-%Minute%-%Second%
Ben aşağıdakileri kullanıyorum:
set iso_date=%date:~6,4%-%date:~3,2%-%date:~0,2%
Veya günlük dosyası adı 'MyLogFileName' ile birlikte:
set log_file=%date:~6,4%-%date:~3,2%-%date:~0,2%-MyLogFileName
Güvenilir bir çözüm elde etmek için tek seferlik 10 ila 30 dakikalık bir yatırımın sakıncası yoksa (bu, Windows'un bölge ayarlarına bağlı değildir), lütfen okumaya devam edin.
Aklımızı serbest bırakalım. Senaryoları sadece böyle görünecek şekilde basitleştirmek ister misiniz? (LOG_DATETIME değişkenini ayarlamak istediğinizi varsayın)
FOR /F "tokens=* USEBACKQ" %%F IN (`FormatNow "yyyy-MM-dd"`) DO (
Set LOG_DATETIME=%%F
)
echo I am going to write log to Testing_%LOG_DATETIME%.log
Yapabilirsin. Basitçe C # .NET ile bir FormatNow.exe oluşturun ve PATH'inize ekleyin.
Notlar:
Faydaları:
Visual Studio 2010 ile oluşturduğum FormatNow.exe'nin kaynak kodu (Bilinmeyen, muhtemelen kötü niyetli bir programı indirme riskini önlemek için onu kendim oluşturmayı tercih ederim). Aşağıdaki kodları kopyalayıp yapıştırın, programı bir kez oluşturun ve ardından gelecekteki tüm kullanımlar için güvenilir bir tarih biçimlendiriciniz olsun.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
namespace FormatNow
{
class Program
{
static void Main(string[] args)
{
try
{
if (args.Length < 1)
{
throw new ArgumentException("Missing format");
}
string format = args[0];
Console.Write(DateTime.Now.ToString(format, CultureInfo.InvariantCulture.DateTimeFormat));
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
Genel olarak, karmaşık mantıklarla uğraşırken, çok küçük bir program oluşturarak ve çıktıyı bunun yerine bir toplu komut dosyası değişkenine geri almak için programı çağırarak işi daha basit hale getirebiliriz. Öğrenci değiliz ve sorunları çözmek için yalnızca toplu komut dosyası kuralına uymamızı gerektiren sınavlara girmiyoruz. Gerçek çalışma ortamında, herhangi bir (yasal) yönteme izin verilir. Neden hala birçok basit görev için geçici çözümlere ihtiyaç duyan Windows toplu komut dosyasının zayıf yeteneklerine bağlı kalmalıyız? İş için neden yanlış aleti kullanmalıyız?