Wiersz polecenia systemu Windows: utwórz plik z bieżącą datą w nazwie


19

Próbuję utworzyć plik zip ze skryptu wsadowego. Potrzebuję go nazwać jak archive_.zip

Niestety nie działa to w systemach z datą sformatowaną jak r / m / d z powodu ukośników:

zip some_options "archive_%DATE%.zip"

%DATE%Zmienna rozszerza się na coś podobnego

Mon 09/28/2009

Mam dostęp do pakietu gnuwin32, więc mogę użyć, powiedzmy, sedzastąpić spacje i ukośniki myślnikami. Problem polega na tym, w jaki sposób użyłbym danych wyjściowych seddo utworzenia nazwy pliku archiwum zip?

W Uniksie (bash) można używać cudzysłowów, aby oceniać polecenie w miejscu i używać jego wyniku w innym poleceniu, na przykład:

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

Czy w systemie Windows jest coś podobnego?

A może istnieje sposób na ustawienie zmiennej zwracanej wartości sedi użycie jej do skonstruowania nazwy pliku?

Odpowiedzi:


27

Można zamieniać symbole w zmiennych, używając:

set _date=%DATE:/=-%

1
To fajna sztuczka!
Cristi Diaconescu

PS Czy jest jakiś „liniowy” sposób na pozbycie się spacji lub innych nieprzyjemnych postaci? (w przeciwieństwie do posiadania trzeciej ... n-tej zmiennej temp dla każdego znaku do zastąpienia)
Cristi Diaconescu

Nie przepraszam Wydaje się, że nie ma czegoś takiego. Aby to zrobić, musisz wrócić do składni for. NB: To jest dobre odniesienie do programowania wsadowego: robvanderwoude.com/batchfiles.php
Christopher

5
jest to nawet szybsze niż %date:~-10,2%-%date:~-7,2%-%date:~-4,4% :!
Jess Stone

Jak nikt nie dał +1 twojej odpowiedzi Jess Stone! +1 ode mnie !!!
Arvo Bowen

5

Zawsze używam:

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

Następnie CDate będzie Sat02182012. Jeśli chcesz, aby było to łatwiejsze do sortowania, ustaw CDate na %% d - %% b - %% c, więc będzie to 2012-02-18

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

Aby folder i plik były przyjazne dla daty i godziny.


4

Tutaj zamieściłem odpowiedź na bardzo podobne pytanie . Dzielenie daty w polach odbywa się w 1 linii, zamiast kilku linii w odpowiedzi Harrymca.

Interesująca część to:

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

Ostrzeżenie jest nadal aktualne:

Ostrzeżenie : format daty (rrrrmmdd = %% k %% j %% i) zależy od ustawień regionalnych. Ponieważ używam francuskiego formatu daty (dd / mm / rrrr), muszę użyć „%% k %% j %% i” jako formatu (%% i = dzień, %% j = miesiąc, %% j = rok).

Jeśli twoje ustawienia regionalne są ustawione na styl amerykański (mm / dd / rrrr), powinieneś użyć „%% k %% i %% j” (%% i = miesiąc, %% j = dzień, %% j = rok) .


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

/=-zastępuje /ze znakiem minus.


2

Ten dość okropny fragment kodu powinien zrobić coś, co chcesz

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

Jeśli odpowiednio zmienisz nazwę pliku.


1
Chcesz wyjaśnić potworność? :)
Cristi Diaconescu

Zasadniczo wycina bity z daty i podaje je do połowy nazwy pliku, możesz go przetestować, wykonując echo, a następnie części horroru w wierszu polecenia, więc jeśli wykonasz echo% date: ~ 6,4%, daje rok. Po prostu podciąga datę i godzinę.
Col

Ciekawy. Niestety niezbyt przenośny ...
Cristi Diaconescu

Niestety problem z użyciem podciągów polega na tym, że opiera się on na określonym formacie daty i wysadza się, gdy jest inny. echo %date:~6,4%%date:~3,2%%date:~0,2%powraca 9-289-20na moim komputerze, ponieważ mam ustawioną datę użycia rrrr-MM-dd (więc dzisiaj jest 28.09.2009).
Joshua

To prawda, że ​​używam tego rozwiązania tylko na jednym komputerze, więc nie stanowi to większego problemu.
Col

2

Ponieważ twoje pytanie jest oznaczone jako Windows, znalazłem to rozwiązanie, które działa w starych dobrych plikach .bat:
„Plik wsadowy Windows (.bat), aby uzyskać bieżącą datę w formacie MMDDYYYY” ,
i prawdopodobnie można go dostosować do Twojego przypadku:

echo w
@REM Szybkiej partii Seamonkey (format
MMDDRRRR ) @REM Ustawia zmienną% daty
@REM Najpierw analizuje miesiąc, dzień i rok w formacie mm, dd, rrrr, a następnie łączy się w MMDDRRRR

FOR / F „TOKENS = 1 * DELIMS =” %% A IN („DATE / T”) USTAW CDATE = %% B
FOR / F „TOKENS = 1,2 eol = / DELIMS = /” %% A IN ( „DATA / T”) DO SET mm = %% B
FOR / F „TOKENS = 1,2 DELIMS = / eol = /” %% A IN ('echo% CDATE%') DO SET dd = %% B
FOR / F „TOKENS = 2,3 DELIMS = /” %% A IN ('echo% CDATE%') USTAW rrrr = %% Bv vSET data =% mm %% dd %% rrrr%

powoduje to jedynie ustawienie zmiennej% date na dzisiejszą datę w formacie MMDDRRRR, aby można ją było wywołać później w skrypcie.

Edytuj
Znaleziono lepszą składnię. Biorąc pod uwagę, że moją datą jest dziś „Pon 28/09/2009”:
ustaw dzień =% Data: ~ 0,2%
ustaw miesiąc =% Data: ~ 7,2%
ustaw rok =% Data: ~ 10,4%


2

czysta wersja cmd.exe w połączeniu z gnuwin32-„data”:

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

Dzięki temu może dokonywać zmian na miejscu! Jeśli mnie zapytasz, polecenie „for” ma jedną dziwną składnię ...
Cristi Diaconescu,

nie twierdziłem, że nie może :) Całe to „cmd” i tak jest szalone, ktokolwiek to zaprojektował, był głęboko w jakimś złym śnie. cmd „for” faktycznie tworzy linie (aka „rozwija” pętlę) w pierwszym przejściu, a następnie wykonuje tak „stworzony” skrypt.
akira

1

co z użyciem cscript + vbasic:

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

zadzwoń przez

cscript /nologo zip_it.vbs

1

Dla / f "tokenów = 1,2,3,4,5 delims = /." %% a in ('date / T') ustaw CDate = %% d - %% b - %% c

Dane @echo =% CDate%

Dzieje się tak w Dniu-Miesiącu-Dniu, który jest obecnie najczęstszym dniem


1

Każde rozwiązanie, które korzysta z któregokolwiek %DATE%z danych wyjściowych, date /tmoże się zepsuć, jeśli użytkownik zmodyfikuje swoje ustawienia regionalne. Na przykład ustawiłem format „krótkiej daty” na "yyyy-MM-dd", więc jestem %DATE%równy "2012-02-18"i date /tgeneruję ten sam wynik. (Dotyczy to systemu Windows 7; zakładam, że jest tak samo we wcześniejszych wersjach systemu Windows).

Zbuduj plik wsadowy, a następnie uruchom go.

Ponieważ masz datedostępne polecenie GNU , możesz zrobić coś takiego:

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

tmp.bat będzie zawierać coś takiego:

zip some_options archive_2012-02-18.zip

Zauważ, że tworzy się to tmp.batw bieżącym katalogu, co może stanowić problem; może być lepiej stworzyć %TEMP%\tmp.bat. Później też nie usunąłem pliku; to dość łatwe do zrobienia.

date +FORMATpozwala określić format wyjściowy datepolecenia, podobny do ciągu printfformatu; szczegóły w dokumentacji daty coreutils . Format może zawierać dowolny tekst, więc w tym przypadku nawet nie musisz go używać sed.


1

Myślę, że jeśli połączysz wszystkie drobiazgi razem, dostaniesz coś, co działa dla ciebie. Jest to system Windows 2003, który daje mi migawkę uruchomionych procesów w odpowiedzi na wyzwalacz z monitora wydajności:

@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

Plik wyjściowy jest nazywany jednym ciągiem bez ograniczników.


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

Powinno działać.

Z drugiej strony - być może masz datedostępne polecenie (nie znam systemu Windows). Jeśli tak, po prostu wykonaj:

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

Sztuczka wsteczna nie działa w programie cmd.exe. A polecenie „data” systemu Windows nie obsługuje formatowania :(
Cristi Diaconescu,

-1

nie jestem pewien, czy ci pasuje, ale mój kod jest

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

OP chce pliku z bieżącą datą w nazwie pliku , a nie w treści pliku
Jan Doggen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.