Dòng lệnh Windows: tạo một tệp có ngày hiện tại trong tên của nó


19

Tôi đang cố gắng tạo một tệp zip từ một tập lệnh bó. Tôi cần nó được đặt tên như archive_.zip

Thật không may, điều này không hoạt động trên các hệ thống có ngày được định dạng như y / m / d vì các dấu gạch chéo:

zip some_options "archive_%DATE%.zip"

Các %DATE%biến mở rộng tới một cái gì đó như

Mon 09/28/2009

Tôi có quyền truy cập vào gói gnuwin32, vì vậy tôi có thể sử dụng, sedđể thay thế khoảng trắng và dấu gạch chéo bằng dấu gạch ngang. Vấn đề là, làm thế nào tôi có thể sử dụng đầu ra của sedđể tạo tên tệp của kho lưu trữ zip?

Trong Unix (bash), người ta có thể sử dụng dấu ngoặc kép để đánh giá tại chỗ một lệnh và sử dụng đầu ra của nó trong một lệnh khác, đại loại như:

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

Có bất cứ điều gì tương tự có sẵn trong Windows?

Hoặc có thể có một cách để đặt một biến thành giá trị được trả về sedvà sử dụng biến đó để xây dựng tên tệp?

Câu trả lời:


27

Bạn có thể thay thế các ký hiệu trong các biến bằng cách sử dụng:

set _date=%DATE:/=-%

1
Đây là một mẹo gọn gàng!
Cristi Diaconescu

Tái bút: Có cách nào để "thoát khỏi không gian" hoặc các nhân vật khó chịu khác không? (trái ngược với việc có một biến tạm thời thứ 3 ... thứ n cho mỗi nhân vật để thay thế)
Cristi Diaconescu

Không xin lỗi. Dường như không có điều đó. Bạn phải dự phòng cú pháp để làm điều đó. NB: Đây là một tài liệu tham khảo hay cho lập trình hàng loạt: robvanderwoude.com/batchfiles.php
Christopher

5
Điều này thậm chí còn nhanh hơn : %date:~-10,2%-%date:~-7,2%-%date:~-4,4% !
Jess Stone

Làm thế nào không có ai +1 phản hồi của bạn Jess Stone! +1 từ tôi !!!
Arvo Bowen

5

Tôi luôn luôn sử dụng:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

Thì CDate sẽ là Sat02182012. Nếu bạn muốn làm cho nó dễ sắp xếp hơn, hãy đặt CDate thành %% d - %% b - %% c, vì vậy nó sẽ là 2012/02/18

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

Để làm cho ngày và thời gian thư mục / tập tin thân thiện.


4

Tôi đã đăng một câu trả lời cho một câu hỏi rất giống ở đây . Việc chia ngày tháng trong các trường được thực hiện trong 1 dòng, thay vì một vài dòng trong câu trả lời của harrymc.

Phần thú vị là:

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

Và cảnh báo vẫn có liên quan:

Cảnh báo : định dạng của ngày (yyyymmdd = %% k %% j %% i) tùy thuộc vào cài đặt khu vực của bạn. Vì tôi sử dụng định dạng ngày của Pháp (dd / mm / yyyy), tôi phải sử dụng "%% k %% j %% i" làm định dạng (%% i = ngày, %% j = tháng, %% j = năm).

Nếu cài đặt khu vực của bạn được đặt thành kiểu Mỹ (mm / dd / yyyy), bạn nên sử dụng "%% k %% i %% j" (%% i = tháng, %% j = ngày, %% j = năm) .


3
zip some_options "archive_%date:/=-%.zip"

các /=-thay thế /bằng một dấu trừ.


2

Đoạn mã khá kinh khủng này sẽ làm một cái gì đó giống như những gì bạn muốn

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

Nếu bạn thay đổi tên tệp một cách thích hợp.


1
Quan tâm để giải thích sự quái dị? :)
Cristi Diaconescu

Về cơ bản, nó cắt các bit ra khỏi ngày và đưa nó vào giữa tên tệp, bạn có thể kiểm tra nó bằng cách tạo ra tiếng vang sau đó là một phần của nỗi kinh hoàng ở dòng lệnh, vì vậy nếu bạn thực hiện echo% date: ~ 6,4% thì nó mang lại năm. Nó chỉ là nền tảng của ngày và thời gian.
Col

Hấp dẫn. Không may quá di động ...
Cristi Diaconescu

Thật không may, vấn đề với việc sử dụng các chuỗi con là nó phụ thuộc vào một định dạng ngày nhất định và sẽ nổ tung khi nó khác nhau. echo %date:~6,4%%date:~3,2%%date:~0,2%trả 9-289-20về máy của tôi vì tôi đã đặt ngày sử dụng yyyy-MM-dd (vì vậy hôm nay là 2009-09-28).
Joshua

Đúng, tôi chỉ sử dụng giải pháp này trên một máy nên không có vấn đề gì quá lớn.
Col

2

Kể từ khi câu hỏi của bạn được gắn thẻ như Windows, tôi thấy giải pháp này mà làm việc trong các tập tin .bat cũ tốt:
"Windows Batch File (.bat) để có được ngày hiện tại trong định dạng MMDDYYYY" ,
và có lẽ có thể được thích nghi với trường hợp của bạn:

tiếng vang trên
hàng loạt cập nhật nhanh chóng @REM Seamonkey của (định dạng MMDDYYYY)
thiết lập @REM biến ngày%
@REM Đầu tiên phân tích tháng, ngày và năm vào mm, dd, định dạng yyyy và sau đó kết hợp được MMDDYYYY

FOR / F FAN TOKENS = 1 * DELIMS = '%% A IN (' DATE / T ') DO SET CDATE = %% B
FOR / F phiên bản TOKENS = 1,2 eol = / DELIMS = / %% A IN ( 'NGÀY / T') DO SET mm = %% B
FOR / F, TOKENS = 1,2 DELIMS = / eol = /. %% A IN ('echo% CDATE%') DO SET dd = %% B
FOR / FAN TOKENS = 2,3 DELIMS = / '%%% A IN (' echo% CDATE% ') DO SET yyyy = %% Bv vSET ngày =% mm %% dd %% yyyy%

điều này không có gì ngoài việc thiết lập biến% date thành ngày hôm nay theo định dạng MMDDYYYY để nó có thể được gọi sau trong tập lệnh.

Chỉnh sửa
Tìm thấy một cú pháp tốt hơn. Cho rằng ngày của tôi là hôm nay "Thứ hai 28/09/2009":
ngày đặt =% Ngày: ~ 0,2%
tháng đặt =% Ngày: ~ 7,2%
năm đặt =% Ngày: ~ 10,4%


2

phiên bản cmd.exe thuần túy kết hợp với gnuwin32-'date ':

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>

Vì vậy, nó có thể làm thay thế tại chỗ! Nếu bạn hỏi tôi, lệnh 'for' có một cú pháp kỳ lạ ...
Cristi Diaconescu

tôi đã không tuyên bố rằng nó không thể :) toàn bộ công cụ 'cmd' là điên rồ, bất cứ ai thiết kế sâu vào một loại giấc mơ xấu. 'for' cmd thực sự tạo ra các dòng (còn gọi là 'unrolls' 'loop') trong lần đầu tiên và sau đó thực thi tập lệnh 'được tạo'.
akira

1

những gì về việc sử dụng cscript + vbasic:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

gọi nó qua

cscript /nologo zip_it.vbs

1

Đối với / f "mã thông báo = 1,2,3,4,5 độ trễ = /." %% A trong ('ngày / T'), hãy đặt CDate = %% d - %% b - %% c

@echo dữ liệu =% CDate%

Đây là vào ngày tháng tháng phổ biến nhất hiện nay


1

Bất kỳ giải pháp nào sử dụng một trong hai %DATE%hoặc đầu ra date /tđều có khả năng bị hỏng nếu người dùng đã sửa đổi cài đặt khu vực của mình. Ví dụ: tôi đã đặt định dạng "ngày ngắn" của mình thành "yyyy-MM-dd", vì vậy tôi có %DATE%bằng "2012-02-18"date /ttạo ra cùng một đầu ra. (Cái này dành cho Windows 7; tôi cho rằng nó giống với các phiên bản Windows trước.)

Xây dựng một tập tin hàng loạt và sau đó thực hiện nó.

Vì bạn có datesẵn lệnh GNU , bạn có thể làm một cái gì đó như thế này:

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat sẽ chứa một cái gì đó như:

zip some_options archive_2012-02-18.zip

Lưu ý rằng điều này tạo ra tmp.battrong thư mục hiện tại, có thể là một vấn đề; nó có thể tốt hơn để tạo ra %TEMP%\tmp.bat. Tôi cũng không xóa tập tin sau đó; Điều đó đủ dễ để làm.

date +FORMATcho phép bạn chỉ định định dạng đầu ra của datelệnh, tương tự như printfchuỗi định dạng; xem tài liệu ngày coreutils để biết chi tiết. Định dạng có thể bao gồm văn bản tùy ý, vì vậy trong trường hợp này bạn thậm chí không cần sử dụng sed.


1

Tôi đoán, nếu bạn đặt các bit của mọi người lại với nhau, bạn sẽ có được thứ gì đó phù hợp với mình. Đây là trên một hệ thống Windows 2003 để cung cấp cho tôi ảnh chụp nhanh về các quy trình đang chạy để đáp ứng với trình kích hoạt từ màn hình hiệu suất:

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

Tệp đầu ra được đặt tên trong một chuỗi không có dấu phân cách.


0
zip [...] archive_`echo %DATE% | tr / -`.zip

Nên làm việc.

Mặt khác - có lẽ bạn có datesẵn lệnh (Tôi không biết Windows). Nếu có, sau đó chỉ cần làm:

zip [...] archive_`date +'%Y-%m-%d'`.zip

Thủ thuật backtick không hoạt động trong cmd.exe. Và lệnh 'ngày' của Windows không thể xử lý định dạng :(
Cristi Diaconescu

-1

không chắc nó có phù hợp với bạn không, nhưng mã của tôi là

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt

OP muốn một tệp có ngày hiện tại trong tên tệp chứ không phải trong nội dung tệp
Jan Doggen
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.