Windows komut satırı: geçerli tarih adında bir dosya oluşturun


19

Bir toplu iş komut dosyasından bir zip dosyası oluşturmaya çalışıyorum. Archive_.zip gibi adlandırılmaya ihtiyacım var

Maalesef, eğik çizgiler nedeniyle tarihi y / m / d gibi biçimlendirilmiş sistemlerde çalışmaz:

zip some_options "archive_%DATE%.zip"

%DATE%Değişken gibi genişler

Mon 09/28/2009

Gnuwin32 paketine erişimim var, bu yüzden diyelim ki sedboşlukları ve eğik çizgileri tireler ile değiştirmek için kullanabilirsiniz . Sorun şu ki, sedzip arşivinin dosya adını oluşturmak için çıktısını nasıl kullanırım ?

Unix'te (bash), bir komutu yerinde değerlendirmek ve çıktısını başka bir komutta kullanmak için geri tırnak işaretleri kullanılabilir:

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

Windows'ta benzer bir şey var mı?

Ya da döndürülen değerine bir değişken ayarlamak sedve bunu dosya adını oluşturmak için kullanmak için bir yol var mı?

Yanıtlar:


27

Değişkenlerdeki sembolleri aşağıdakileri kullanarak değiştirebilirsiniz:

set _date=%DATE:/=-%

1
Bu temiz bir numara!
Cristi Diaconescu

Not Boşluklardan veya diğer kötü karakterlerden kurtulmanın 'tek satırlı' bir yolu var mı? (değiştirilecek her karakter için 3. ... nth temp değişkenine karşı)
Cristi Diaconescu

Üzgünüm. Öyle bir şey yok gibi görünüyor. Bunu yapmak için sözdizimine geri dönmelisiniz. Not: Bu, toplu programlama için güzel bir referanstır: robvanderwoude.com/batchfiles.php
Christopher

5
Bu da daha hızlı geçerli: %date:~-10,2%-%date:~-7,2%-%date:~-4,4% !
Jess Stone

Kimse cevabınızı nasıl + 1'lemedi Jess Stone! Benden +1 !!!
Arvo Bowen

5

Her zaman kullanıyorum:

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

Sonra CDate Sat02182012 olacaktır. Daha sıralanabilir hale getirmek istiyorsanız, CDate'i %% d - %% b - %% c olarak ayarlayın, böylece 2012-02-18 olacaktır

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

Tarih ve saati klasör / dosya dostu yapmak.


4

Burada çok benzer bir soruya cevap gönderdim . Tarihlerin alanlara ayrılması, harrymc cevabındaki birkaç satır yerine 1 satırda yapılır.

İlginç olan kısım:

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

Ve uyarı hala alakalı:

Uyarı : tarih biçimi (yyyymmdd = %% k %% j %% i) bölgesel ayarlarınıza bağlıdır. Fransızca tarih biçimini (gg / aa / yyyy) kullandığım için, biçim olarak "%% k %% j %% i" kullanmam gerekiyor (%% i = gün, %% j = ay, %% j = yıl).

Bölgesel ayarlarınız ABD stiline (aa / gg / yyyy) ayarlanmışsa, "%% k %% i %% j" (%% i = ay, %% j = gün, %% j = yıl) kullanmalısınız .


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

/=-yerine /eksi işareti ile.


2

Bu oldukça korkunç kod parçası istediğiniz gibi bir şey yapmalı

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

Dosya adını uygun şekilde değiştirirseniz.


1
Canavarlığı açıklamak ister misiniz? :)
Cristi Diaconescu

Temel olarak bitleri tarihin dışına çıkarmak ve dosya adının ortasına beslemek, komut satırında önce yankı sonra dehşet bölümlerini yaparak test edebilirsiniz, böylece yankı% tarih yaparsanız: ~% 6,4 yıl. Sadece tarih ve saatin alt dize.
Col

İlginç. Ne yazık ki çok taşınabilir ...
Cristi Diaconescu

Ne yazık ki alt dizeleri kullanmayla ilgili sorun, belirli bir tarih biçimine dayanması ve farklı olduğunda patlamasıdır. yyyy-AA-gg kullanmak için ayarladığımdan beri echo %date:~6,4%%date:~3,2%%date:~0,2%makineme geri döner 9-289-20(bu yüzden bugün 2009-09-28'dir).
Joshua

Doğru, bu çözümü sadece bir makinede kullanıyorum, bu yüzden çok fazla sorun değil.
Col

2

: Sorunuz Windows'un olarak etiketlenmiş olduğundan, eski güzel .bat dosyaları eserler bu çözüm buldu
"Windows toplu iş dosyası (.bat) AAGGYYYY biçimde geçerli tarih almak için" ,
ve muhtemelen duruma adapte edilebilir:

yankı üzerinde
@REM Seamonkey en hızlı tarih toplu (AAGGYYYY biçimi)
@REM Kurulumları% tarih değişkeni
@REM İlk ay, gün ve yıl sonra mm, gg, yyyy biçimleri ve içine birleştirir AAGGYYYY olmak ayrıştırır

FOR / F “TOKENS = 1 * DELIMS =” %% A IN ('TARİH / T') AYAR AYARLA = %% B
FOR / F “TOKENS = 1,2 eol = / DELIMS = /” %% A IN ( 'DATE / T') AYARLA mm = %% B
FOR / F “TOKENS = 1,2 DELIMS = / eol = /” %% A IN ('echo% CDATE%') AYARLA dd = %% B
FOR / F “TOKENS = 2,3 DELIMS = /” %% A IN ('echo% CDATE%') AYARLA yyyy = %% Bv vSET tarihi =% mm %% dd %% yyyy%

bu,% date değişkenini MMDDYYYY biçiminde bugünün tarihi olacak şekilde ayarlamaktan başka bir şey yapmaz, böylece komut dosyasında daha sonra çağrılabilir.

Düzenle
Daha iyi bir sözdizimi bulundu. Tarihimin bugün "Pzt 28/09/2009" olduğu göz önüne alındığında:
ayarlanan gün =% Tarih: ~% 0,2
ayarlanan ay =% Tarih: ~% 7,2
ayarlanan yıl =% Tarih: ~% 10,4


2

gnuwin32-'date 'ile birlikte saf cmd.exe sürümü:

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

Bu yüzden olabilir yerinde değiştirmelerin yap! Bana sorarsanız, 'for' komutunun bir tuhaf sözdizimi vardır ...
Cristi Diaconescu

Ben bunu yapamadık iddia etmedi :) tüm 'cmd' şeyler zaten deli, kim bir tür kötü rüya bir tür derin tasarlanmış. 'for' cmd aslında ilk geçişte satırlar oluşturur (aka 'döngü' unrolls ') ve sonra' oluşturulan 'komut dosyasını yürütür.
akira

1

cscript + vbasic kullanmaya ne dersiniz?

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

yoluyla ara

cscript /nologo zip_it.vbs

1

/ F "belirteçleri = 1,2,3,4,5 sınırlar = /." İçin ('tarih / T') içinde %% a CDate = %% d - %% b - %% c

@echo data =% CDate%

Bu, günümüzde en yaygın olan Yıl-Ay-Gün'de


1

Kullanıcı bölgesel ayarlarını değiştirdiyse %DATE%veya çözümünü kullanan çözümlerin date /tkesilmesi olasıdır. Örneğin, "kısa tarih" biçimimi olarak ayarladım "yyyy-MM-dd", bu yüzden %DATE%eşit "2012-02-18"ve date /taynı çıktıyı üretir. (Bu Windows 7 içindir; Windows'un önceki sürümleri için aynı olduğunu düşünüyorum.)

Bir toplu iş dosyası oluşturun ve çalıştırın.

dateKullanılabilir GNU komutuna sahip olduğunuz için , bunun gibi bir şey yapabilirsiniz:

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

tmp.bat şöyle bir şey içerecektir:

zip some_options archive_2012-02-18.zip

Bunun tmp.batgeçerli dizinde oluşturulduğunu ve bunun bir sorun olabileceğini unutmayın; oluşturmak daha iyi olabilir %TEMP%\tmp.bat. Daha sonra dosyayı kaldırmadım; bu kadar kolay.

date +FORMATbiçim dizesine datebenzer şekilde komutun çıktı biçimini belirlemenizi sağlar printf; ayrıntılar için coreutils tarih belgelerine bakın. Biçim rastgele metin içerebilir, bu nedenle bu durumda kullanmanıza bile gerek yoktur sed.


1

Sanırım, herkesin parçalarını bir araya getirirseniz, sizin için çalışan bir şey elde edersiniz. Bu, Windows 2003 sisteminde performans monitöründen gelen bir tetikleyiciye yanıt olarak çalışan işlemlerin bir anlık görüntüsünü vermek için:

@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

Çıktı dosyası, sınırlayıcı içermeyen bir dizede adlandırılır.


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

Çalışmalı.

Öte yandan - belki de datemevcut komutunuz var (Windows'u bilmiyorum). Cevabınız evetse, şunları yapın:

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

Backtick hile cmd.exe'de çalışmaz. Ve Windows 'tarih' komutu biçimlendirmeyi işleyemiyor :(
Cristi Diaconescu

-1

size uygun olup olmadığından emin değilim, ancak kodum

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

OP , dosya içeriğinde değil dosya adında şu anki tarihi olan bir dosya istiyor
Jan Doggen
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.