วิธีรับวันที่ในไฟล์แบตช์ในรูปแบบที่สามารถคาดเดาได้


17

ในแบตช์ไฟล์ฉันต้องแยกเดือนวันปีจากคำสั่ง date ดังนั้นฉันจึงใช้สิ่งต่อไปนี้ซึ่งแยกวิเคราะห์คำสั่ง Date เพื่อแยกสตริงย่อยลงในตัวแปร:

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

ทั้งหมดนี้ยอดเยี่ยม แต่ถ้าฉันปรับใช้ไฟล์แบทช์นี้กับเครื่องที่มีการตั้งค่าภูมิภาค / ประเทศที่แตกต่างกันมันล้มเหลวเพราะเดือนวันและปีอยู่ในสถานที่ต่างกัน

ฉันจะแยกเดือนวันและปีโดยไม่คำนึงถึงรูปแบบวันที่ได้อย่างไร


1
คุณ จำกัด การแบตช์อย่างแน่นอนหรือไม่? สิ่งนี้ง่ายกว่ามากใน VBScript / WSH และ / หรือ PowerShell ...
Adrien

@Adrien ใช่ จำกัด แบทช์ - เป็นส่วนหนึ่งของขั้นตอนหลังการสร้าง VS2008
AngryHacker

แทนที่% วันที่% โดย% วันที่: ~ 6,4% - วันที่%: ~ 3,2% - วันที่%: ~ 0,2% ทำงาน
MagTun

คำตอบ:


14

ที่มา: http://ss64.com/nt/syntax-getdate.html

วิธีที่ 2 (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

ป้อนคำอธิบายรูปภาพที่นี่


วิธีที่ 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
อาฮาวิธีที่ประณีตมากในการค้นหาวันที่ของสถานที่นั้น ss64 มีชุมชนที่ดีของผู้ใช้ cmd.exe
Nicholi

ฉันรวมสคริปต์ทั้งสองไว้ในลิงก์ของคุณ หวังว่ามันโอเคสำหรับคุณ
nixda

@nixda ไม่มีปัญหาอะไรก็ตามที่ผู้ใช้ช่วยเหลือ
Tex Hex

หากคุณต้องการเก็บวินาทีใน "วิธีที่ 2" ข้างต้นให้เพิ่มSet _second=00%%Kเมื่อแยกออกจากwmicและเติมด้วยศูนย์นำหน้าเหมือนคนอื่น ๆ
ทิม Parenti

13

Windows XP และใหม่กว่า

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%

เอาท์พุต

ป้อนคำอธิบายรูปภาพที่นี่


+1 สำหรับคำตอบที่กระชับที่สุด ฉันขอแนะนำให้ลงท้ายด้วยECHO %year%-%month%-%day%ซึ่งเป็นรูปแบบที่เข้ากันได้กับISO และระบบไฟล์ (ไม่พูดถึงเรียงลำดับโดยอัตโนมัติตามปีเดือนวัน) :-)
Zephan Schroeder

3

ฉันรู้ว่ามันไม่ตรงกับที่คุณขอ แต่ฉันใช้พอร์ต Windows ของdateแอปพลิเคชันLinux จากคำสั่งภายในไฟล์แบตช์แล้วกำหนดผลลัพธ์ให้กับตัวแปร

ฉันยังไม่พบวิธีรับวันที่ที่เชื่อถือได้โดยใช้ชุดคำสั่งเท่านั้น


2

ใช้ไฟล์แบตช์นี้สำหรับรูปแบบ YYYY-MM-DD มันใช้เครื่องมือเครื่องมือวัดหน้าต่างที่ควรมีอยู่ใน Windows ทุกรุ่นล่าสุดเพื่อรับสตริง datetime ซึ่งไม่ขึ้นอยู่กับการตั้งค่าภูมิภาค

บันทึกลงแบตช์ไฟล์ลงในพา ธ (เช่น) c: \ windows \ rdate.bat จากนั้นเข้าถึงด้วย CALL RDATE.BAT เพื่อตั้งค่าตัวแปร อีกวิธีหนึ่งคือคัดลอกรหัสลงในแบทช์ไฟล์ของคุณ

รูปแบบวันที่นี้เหมาะสำหรับชื่อไฟล์และการบันทึก มันจัดเรียงอย่างถูกต้อง ตัวแปร logtime เพิ่มตัวแปร date + time เป็น YYYY-MM-DD-HHMMSS ที่เหมาะสมสำหรับใช้ในการบันทึกกิจกรรมแบตช์ไฟล์ที่ความแม่นยำที่สอง

ปรับรูปแบบวันที่ (และเวลา) ตามที่คุณต้องการ REM แสดงก้องหน้าจอในการผลิต ตัวเลขสองตัวในการเลือกข้อความแต่ละรายการคือดัชนีเริ่มต้นของอักขระเริ่มต้นที่เป็นศูนย์และจำนวนอักขระที่จะคัดลอกเช่น% datetime: ~ 0,4% ใช้สตริงย่อย 4 อักขระเริ่มต้นที่ตำแหน่ง 0

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
ใกล้เคียงกับคำตอบของ and31415 สคริปต์ทั้งสองใช้wmic os get localdatetime
nixda

1

ในขณะที่คุณพูดถูก VS 2008 จะส่งออกไฟล์แบทช์คุณสามารถเรียกใช้โปรแกรมที่คุณต้องการได้รวมถึงสคริปต์ Powershell และโปรแกรมอื่น ๆ

แก้ไข:

นี่คือคำถามที่คล้ายกัน:

/programming/1051845/visual-studio-2008-professional-build-process /programming/3049369/embed-application-compilation-time-stamp

เดิมทีฉันจะต้องย้ายไปที่ SO . .


0

คุณลองใช้NET TIME \\%ComputerName%แทนDATEหรือไม่ ฉันคิดว่าNET TIMEควรให้ข้อมูลในรูปแบบที่สอดคล้องโดยไม่คำนึงถึงภาษา


ไม่มันไม่ได้
AngryHacker

น่าสนใจฉันลองใช้มันสลับไปมาระหว่างรูปแบบ AU และสหรัฐอเมริกาและnet timeส่งออกในรูปแบบ m / d / yyyy เสมอ @AngryHacker การตั้งค่าแบบใดที่ไม่ได้ผลสำหรับคุณ
Hydaral

1
ฉันเปลี่ยนภาษาฝรั่งเศส (เบลเยี่ยม) และให้ฉัน 2011-07-27 สหรัฐฯให้
07/27/2011

0

ขอบคุณโพสต์ของ Shekhar ซึ่งทำงานได้ตามที่ต้องการและไม่มีการแพ็ดเวลา

@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%

เอาต์พุต: LogFile-20151113-0901.txt


-1

นี่อาจเป็นหัวข้อที่ค่อนข้างไม่ชัดเจน แต่นี่เป็นไฟล์. bat ที่ฉันเขียนสำหรับการสำรองข้อมูลตามกำหนดเวลาของฉันเอง ฉันหวังว่าบางคนจะพบว่ามีประโยชน์

บันทึกสิ่งต่อไปนี้ลงในไฟล์. bat

--------------------------------------------------
**:: 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 คุณอาจเพิ่มคำอธิบายว่าสคริปต์ทำอะไร เพราะมันไม่ได้หลุดออกมาเป็นทางออกทันที มันอาจจะมีประโยชน์มากกว่าถ้าคุณสามารถลบส่วนของโค้ดที่ไม่เกี่ยวข้องออกได้
Shekhar

1
สคริปต์แบตช์ทั้งหมดขึ้นอยู่กับ%date%และ%time%ตัวแปรซึ่งเป็นโลแคลที่รับรู้และไม่สามารถแยกวิเคราะห์ได้ในวิธีที่คาดเดาได้ตามที่ OP ถาม
and31415
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.