Làm cách nào để lấy Ngày trong một tệp bó theo định dạng có thể dự đoán được?


17

Trong một tệp bó tôi cần trích xuất một tháng, ngày, năm từ lệnh ngày. Vì vậy, tôi đã sử dụng như sau, về cơ bản phân tích lệnh Date để trích xuất các chuỗi con của nó thành một biến:

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

Đây là tất cả tuyệt vời, nhưng nếu tôi triển khai tệp bó này đến một máy có cài đặt khu vực / quốc gia khác, thì không thành công vì tháng, ngày và năm ở các vị trí khác nhau.

Làm cách nào tôi có thể trích xuất tháng, ngày và năm bất kể định dạng ngày?


1
Bạn hoàn toàn bị hạn chế trong Batch? Một điều như vậy đơn giản hơn nhiều trong VBScript / WSH và / hoặc PowerShell ...
Adrien

@Adrien, Có giới hạn theo đợt - đó là một phần của bước hậu xây dựng VS2008.
AngryHacker

thay thế% ngày% bằng% ngày: ~ 6,4% -% ngày: ~ 3,2% -% ngày: ~ 0,2% đã hoạt động
MagTun

Câu trả lời:


14

Nguồn: http://ss64.com/nt/syntax-getdate.html

Phương pháp 2 (cmd đơn)

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

nhập mô tả hình ảnh ở đây


Phương pháp 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, cách rất gọn gàng trong việc tìm kiếm thứ tự ngày của địa phương. ss64 có một cộng đồng người dùng cmd.exe tiện lợi.
Nicholi

Tôi bao gồm cả hai tập lệnh từ liên kết nguồn của bạn. Hy vọng nó ổn cho bạn
nixda

@nixda Không có vấn đề gì, bất cứ điều gì người dùng giúp.
Tex Hex

Nếu bạn cần giữ lại các giây trong "Phương pháp 2" ở trên, hãy thêm Set _second=00%%Kkhi trích xuất từ wmicvà đệm với các số 0 đứng đầu như các số khác.
Tim Parenti

12

Windows XP trở lên

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%

Đầu ra

nhập mô tả hình ảnh ở đây


+1 cho câu trả lời ngắn gọn nhất. Tôi cũng đề nghị kết thúc với ECHO %year%-%month%-%day%định dạng tương thích ISO và hệ thống tập tin (không đề cập đến việc tự động sắp xếp theo năm tháng). :-).
Zephan Schroeder

3

Tôi biết đó không chính xác là những gì bạn yêu cầu, nhưng tôi sử dụng cổng Windows của dateứng dụng Linux từ một lệnh bên trong tệp bó và sau đó gán kết quả cho một biến.

Tôi vẫn chưa tìm được cách lấy ngày một cách đáng tin cậy bằng cách chỉ sử dụng các lệnh bó.


2

Sử dụng tệp bó này cho định dạng YYYY-MM-DD. Nó sử dụng công cụ thiết bị cửa sổ sẽ có trong tất cả các phiên bản Windows gần đây để có được chuỗi thời gian độc lập với cài đặt khu vực.

Lưu vào một tệp bó vào đường dẫn (ví dụ) c: \ windows \ rdate.bat sau đó truy cập bằng CALL RDATE.BAT để đặt (các) biến. Thay phiên, sao chép mã vào tệp bó của bạn.

Định dạng ngày này phù hợp cho tên tệp và đăng nhập. Nó sắp xếp chính xác. Biến logtime thêm biến ngày + thời gian là YYYY-MM-DD-HHMMSS phù hợp để sử dụng trong ghi nhật ký hoạt động của tệp bó ở độ chính xác thứ hai.

Điều chỉnh định dạng ngày (và thời gian) theo ý muốn. REM tiếng vang màn hình trong sản xuất. Hai số trong mỗi lựa chọn văn bản là chỉ số ký tự bắt đầu dựa trên số 0 và số ký tự cần sao chép, ví dụ:% datetime: ~ 0,4% lấy chuỗi con 4 ký tự bắt đầu từ vị trí 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
Gần giống như câu trả lời của and31415 . Cả hai tập lệnh đều sử dụngwmic os get localdatetime
nixda 6/08/2015


0

Bạn đã thử sử dụng NET TIME \\%ComputerName%thay vì DATE? Tôi nghĩ rằng nó NET TIMEđược cho là cung cấp dữ liệu theo một định dạng nhất quán bất kể miền địa phương.


Không, nó không.
AngryHacker

Thật thú vị, tôi chỉ thử nó, chuyển đổi giữa các định dạng AU và US và net timeluôn xuất ra ở định dạng m / d / yyyy. @AngryHacker, với cài đặt nào nó không hoạt động cho bạn?
Hydaral

1
Tôi đã chuyển sang tiếng Pháp (tiếng Bỉ) và nó đã cho tôi 2011-07-27. Hoa Kỳ tặng
27/07/2011

0

Nhờ bài viết của Shekhar, tác phẩm này là cần thiết và không có phần đệm thời gian.

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

Đầu ra: LogFile-20151113-0901.txt


-1

Điều này có thể hơi lạc đề nhưng đây là một tập tin .bat mà tôi đã viết cho các bản sao lưu theo lịch trình của riêng mình và cũng gọi từ các hành động postbuild trong studio hình ảnh. Tôi hy vọng rằng một số sẽ tìm thấy nó hữu ích.

Lưu các mục sau vào tệp .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, bạn có thể thêm một lời giải thích về những gì kịch bản làm. bởi vì nó không đi ra như một giải pháp ngay lập tức. Nó cũng có thể hữu ích hơn, nếu bạn có thể loại bỏ các đoạn mã không thích hợp
Shekhar

1
Toàn bộ tập lệnh bó dựa vào %date%%time%các biến, có thể nhận biết được miền địa phương và thực sự không thể được phân tích cú pháp theo cách có thể dự đoán được như OP yêu cầu.
và31415
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.