Tarihi bir toplu iş dosyasında öngörülebilir bir biçimde nasıl edinebilirim?


17

Bir toplu iş dosyasında, tarih komutundan bir ay, gün, yıl ayıklamam gerekiyor. Bu nedenle, alt dizelerini bir değişkene ayıklamak için Date komutunu ayrıştıran aşağıdakileri kullandım:

set Day=%Date:~3,2%
set Mth=%Date:~0,2%
set Yr=%Date:~6,4%

Bu harika, ancak bu toplu iş dosyasını farklı bölge / ülke ayarlarına sahip bir makineye dağıtırsam, ay, gün ve yıl farklı konumlarda olduğu için başarısız olur.

Tarih formatından bağımsız olarak ay, gün ve yılı nasıl ayıklayabilirim?


1
Kesinlikle Toplu İş ile kısıtlı mısınız? VBScript / WSH ve / veya PowerShell'de böyle bir şey çok daha basit ...
Adrien

@ Adrien, evet toplu iş ile sınırlı - bu VS2008 post-build adımının bir parçası.
AngryHacker

% tarih% 'in% tarihe göre değiştirilmesi: ~% 6,4 -% Tarih: ~% 3,2 -% Tarih: ~% 0,2 çalıştı
MagTun

Yanıtlar:


14

Kaynak: http://ss64.com/nt/syntax-getdate.html

Yöntem 2 (tek cmd)

GetDate.cmd

@Echo off
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%

:: Display the date/time in ISO 8601 format:
Set _isodate=%_yyyy%-%_mm%-%_dd% %_hour%:%_minute%
Echo %_isodate%
pause

resim açıklamasını buraya girin


Yöntem 1 (cmd + vb)

GetDate.cmd

@Echo off
For /f %%G in ('cscript /nologo getdate.vbs') do set _dtm=%%G
Set _yyyy=%_dtm:~0,4%
Set _mm=%_dtm:~4,2%
Set _dd=%_dtm:~6,2%
Set _hh=%_dtm:~8,2%
Set _nn=%_dtm:~10,2%
Echo %_yyyy%-%_mm%-%_dd%T%_hh%:%_nn%

getdate.vbs

Dim dt
dt=now
'output format: yyyymmddHHnn
wscript.echo ((year(dt)*100 + month(dt))*100 + day(dt))*10000 + hour(dt)*100 + minute(dt)

1
Ah ha, yerin tarih sırasını bulmanın çok düzgün bir yolu. ss64 cmd.exe kullanıcıları şık bir topluluk var.
Nicholi

Kaynak bağlantınızdaki her iki komut dosyasını da dahil ettim. Umarım senin için uygun
nixda

@nixda Sorun yok, kullanıcı ne olursa olsun.
Tex Hex

Yukarıdaki "Yöntem 2" de saniyeleri tutmanız gerekiyorsa , diğerleri gibi Set _second=00%%Kçıkarırken wmicve diğerleriyle sıfırlama yaparken ekleyin .
Tim Parenti

13

Windows XP ve üzeri

getDate.cmd

@echo off
for /f "tokens=2 delims==" %%G in ('wmic os get localdatetime /value') do set datetime=%%G

set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%

echo %year%/%month%/%day%

Çıktı

resim açıklamasını buraya girin


En kısa cevap için +1. Ayrıca ECHO %year%-%month%-%day%ISO ve dosya sistemi uyumlu bir formatla bitirmenizi de öneririm (yıl-ay-güne göre otomatik olarak sıralanır). :-).
Zephan Schroeder

3

Tam olarak ne istediğini biliyorum, ama datetoplu iş dosyası içindeki bir komuttan Linux uygulamasının Windows portunu kullanıyorum ve sonucu bir değişkene atarım.

Yalnızca toplu komutları kullanarak tarihi güvenilir bir şekilde almanın bir yolunu bulmadım.


2

YYYY-AA-GG biçimi için bu toplu iş dosyasını kullanın. Bölgesel ayarlardan bağımsız bir datetime dizesi almak için tüm son Windows sürümlerinde bulunması gereken pencere enstrümantasyon aracını kullanır.

Bir toplu iş dosyasına (örn.) C: \ windows \ rdate.bat yoluna kaydedin ve sonra değişkenleri ayarlamak için CALL RDATE.BAT ile erişin. Alternatif olarak, kodu toplu iş dosyanıza kopyalayın.

Bu tarih biçimi dosya adları ve günlük kaydı için uygundur. Doğru şekilde sıralar. Logtime değişkeni, toplu iş dosyası etkinliğini ikinci doğrulukta günlüğe kaydetmek için uygun YYYY-AA-GG-HHMMSS olarak bir tarih + saat değişkeni ekler.

Tarih (ve saat) biçimlerini istediğiniz gibi ayarlayın. Üretimde ekran ekolarını REM. Her metin seçimindeki iki sayı, sıfır temelli başlangıç ​​karakter dizini ve kopyalanacak karakter sayısıdır, örneğin% datetime: ~ 0,4%, 0 konumundan başlayarak 4 karakterlik bir alt dize alır.

echo off
rem First, get the locality-invariant datetime
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
rem echo %datetime%

rem Build the reverse date string YYYY-MM-DD
set rdate=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2%
echo rdate=%rdate%

rem Built a datetime string YYYY-MM-DD-hhmmss
set logtime=%rdate%-%datetime:~8,6% 
echo logtime=%logtime%

1
Neredeyse and31415'in cevabı ile aynı . Her iki komut dosyası da kullanırwmic os get localdatetime
nixda


0

NET TIME \\%ComputerName%Bunun yerine kullanmayı denediniz DATEmi? Bunun NET TIMEyerel ayara bakılmaksızın verileri tutarlı bir biçimde sağlaması gerektiğini düşünüyorum .


Hayır, değil.
AngryHacker

İlginç, sadece denedim, AU ve ABD formatları arasında geçiş ve net timeher zaman m / d / yyyy formatında çıktı. @AngryHacker, hangi ayarlarla sizin için çalışmadı?
Hydaral

1
Fransızca'yı (Belçika) değiştirdim ve bana 2011-07-27 verdi. ABD
07/27/2011

0

Shekhar'ın gönderisi sayesinde bu gerektiği gibi çalışıyor ve zamanın sıfır dolgusu.

@Echo Off

for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%%date:~4,2%%date:~7,2%-%%d%%e

set datetimestr=%var: =0%

set logfile=LogFile-%datetimestr%.txt

echo %logfile%

Çıktı: LogFile-20151113-0901.txt


-1

Bu biraz konu dışı olabilir, ancak burada kendi zamanlanmış yedeklemeler için yazdığım ve ayrıca görsel stüdyoda post-action eylemlerinden çağırdığım bir .bat dosyası. Umarım bazıları bunu faydalı bulur.

Aşağıdakileri bir .bat dosyasına kaydedin

--------------------------------------------------
**:: The following is Copyright © 2012 ShopNetNuke Corp.  All rights reserved.
::  and released under the GNU General Public License (GPLv3)**

:: The following section retrieves the current date and time and formats it into the '%var%' variable
:: This format always ensures that the Date and Time are fixed length to avoid the situation of
:: having a value of '12/ 1/2012 rather than '12/01/2012'
echo off
for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
set var=%var: =0%
echo Beginning my valuable Backup Set:  Backup--%var%

:: If you wanted to request the user input a filename prefix, 
:: then we would use something similar to this
:: set /p nameprefix= Enter the file name prefix?
:: Get the Current Date and Time
::for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
:: set var=%var: =0%
:: echo Beginning my valuable Backup Set:  Backup--%var%_%nameprefix%

Pause

echo Starting SQL Server Database Backup Job...
:: The following line initiates the Backup job within SqlServer Agent.
:: Change 'MyBackupNameInSqlAgent' to the name of the job you want executed
:: Change the directory paths to those relevant to your current system installation directories
:: SqlAgent will not return a value if the backup action succeed, 
:: however, in the event an error is encountered, it will be echoed onto the screen
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe" -S SQLSERVERNAME\INSTANCENAME -Q "execute msdb.dbo.sp_start_job @job_name = 'MyBackupNameInSqlAgent'"
:: An error will be returned if the Backup job is not found or has already been triggered by another process

echo Starting My Valuable Source Code Directory Backup...

echo ...backing up files and folders in "C:\Source\MyPreciousProjectDirectory\"...
:: The following line will execute the 7zip command to create a .7z file of the directory named in 'MyPreciousProjectDirectory'
:: and tells it to put the archive in the 'MyPreciousBackupDirectory'.  The compression level will be defined by the 7zip default settings
:: The -p flag tells 7zip to password protect the archive, in this case, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectory\%var%\MyPreciousProject--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 

echo Source Code Directory Backups complete.

echo Archiving Database Backups now...
:: The following line will execute the 7zip command to archive the Database backup.
:: The '*' could be replaced by the actual backup name.
:: The '*' indicates all files of type '.bak'
:: The -p flag tells 7zip to password protect the archive, in this case, again, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z  C:\MyPreciousBackupDirectory\%var%\MyPreciousProject-Database-%var%.7z -p%var% -mhe "C:\Program Files\Microsoft SQL Server\MSSQL10.SQLDEV08\MSSQL\Backup\*.bak"

echo Database Backup Archival process complete.

:: If you wanted to place both the previous backups into one single combination archive,
:: you could do something like the following
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var%\MyPreciousProjectBackupSourceAndDatabase--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 


echo Now attempting to copy archives to Network Server...
:: The following line will use xcopy to copy the arechives to the server backup directory and place them in a directory named by the DateTime variable %var%
xcopy /S /I /J /Y C:\MyPreciousBackupDirectory\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%
:: Or if the combination above was used then copy that...
xcopy /S /I /J /Y C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%


echo 7z Archive files transferred to MyPreciousBackupServerName successfully
echo  ||
echo \||/
echo  \/
echo ---------------------------------------------------
echo ----- BACKUP SET "%var%" COMPLETE ------
echo ---------------------------------------------------
pause

1
tl; dr, betiğin ne yaptığına dair bir açıklama ekleyebilirsiniz. çünkü hemen bir çözüm olarak ortaya çıkmıyor. Ayrıca, uygun olmayan kod parçalarını kaldırabiliyorsanız daha yararlı olabilir
Shekhar

1
Tüm toplu komut dosyası yerel ayara duyarlı olan ve OP'nin istediği gibi tahmin edilebilir bir şekilde ayrıştırılamayan değişkenlere %date%ve %time%değişkenlere dayanır .
and31415
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.