2008-09-18 10 views

Odpowiedz

59

powłoki systemu Windows, jedna wkładka:

FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT 
+7

To prawdopodobnie powinno być wyjście/b lub goto: eof, aby uniknąć zamknięcia okna cmd ... – Joey

+6

Domyślne ograniczniki to i , więc lepiej jest dodać "delims =" po FOR/F, aby akceptować nazwy plików ze spacjami. Całe polecenie będzie FOR/F "delims =" %% I IN ("DIR *. */B/O: -D") KOPIUJ %% I <> & EXIT – Cheburek

+1

Zwróć uwagę, że spacja przed & staje się część poprzedniego polecenia. To mnie ugryzło SETem, który szczęśliwie umieszcza spacje w wartości. –

2

wiem poprosiłeś dla Windows, ale pomyślałem, że ten dodatek i tak w Unix/Linux można zrobić:

cp `ls -t1 | head -1` /somedir/ 

Które pokaże wszystkie pliki w bieżącym katalogu posortowane według czasu modyfikacji, a następnie cp najnowsze do/somedir/

+0

Nie oczekiwałem tej odpowiedzi w tym poście. Dziękuję Ci bardzo. – Mrk

2

Spowoduje to otwarcie drugiego okna cmd.exe. Jeśli chcesz, aby odszedł, zamień/K na/C.

Oczywiście, zamień new_file_loc na cokolwiek będzie zawierać nowe położenie pliku.

@echo off 
for /F %%i in ('dir /B /O:-D *.txt') do (
    call :open "%%i" 
    exit /B 0 
) 
:open 
    start "window title" "cmd /K copy %~1 new_file_loc" 
exit /B 0 
-2

Bash:

find -type f -printf "%[email protected] %p \n" \ 
    | sort \ 
    | tail -n 1 \ 
    | sed -r "s/^\S+\s//;s/\s*$//" \ 
    | xargs -iSTR cp STR newestfile 

gdzie "newestfile" staną się newestfile

alternatywnie, można zrobić newdir/STR lub po prostu newdir

Podział:

  1. lista wszystkich plików w {time} {plik} format.
  2. sortować je według czasu
  3. dostać ostatni
  4. odciąć czas, a odstępy od początku/końca
  5. kopia otrzymana wartość

Ważne

Po uruchomieniu ten jeden raz, najnowszy plik będzie taki, jaki właśnie skopiowałeś: p (zakładając, że oba są w tym samym zakresie wyszukiwania, co jest). Być może będziesz musiał dostosować, który plik, który skopiuj, jeśli chcesz, aby działało więcej niż jeden raz.

114

Zaakceptowanych odpowiedź daje przykład przy użyciu najnowszego pliku w poleceniu i wyjście. Jeśli trzeba to zrobić w pliku bat z innych skomplikowanych operacji można użyć następujących czynności, aby zapisać nazwę pliku najnowszego pliku w zmiennej:

FOR /F "delims=|" %%I IN ('DIR "*.*" /B /O:D') DO SET NewestFile=%%I 

Teraz można odwoływać% NewestFile% całej reszty twój plik nietoperza.

Na przykład o to, czego używamy, aby uzyskać najnowszą wersję bazy danych.plik bak z katalogu, skopiuj go do serwera, a następnie przywrócić DB:

:Variables 
SET DatabaseBackupPath=\\virtualserver1\Database Backups 

echo. 
echo Restore WebServer Database 
FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET NewestFile=%%I 
copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\" 

sqlcmd -U <username> -P <password> -d master -Q^
"RESTORE DATABASE [ExampleDatabaseName]^
FROM DISK = N'D:\%NewestFile%'^
WITH FILE = 1,^
MOVE N'Example_CS' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example.mdf',^
MOVE N'Example_CS_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example_1.LDF',^
NOUNLOAD, STATS = 10" 
+4

Doskonałe ... Szukałem jak uzyskać najnowszy plik, a podany przykład kodu jest dokładnym powodem, dla którego go szukam , przywracanie kopii zapasowej serwera sql! – tbone

+0

Twoje powitanie, cieszę się, że mogę pomóc =). –

+1

To było pomocne. Wystarczy napisać, że jeśli twoje pliki są niewygodne w podkatalogach (jak moje), możesz użyć flagi "/ S" w DIR, aby sprawdzić rekursywnie. tj. wstaw "/ S" po DIR powyżej i powinno działać. –

9

na to pozwolić pracować z nazwy plików za pomocą spacji, zmodyfikowaną wersją przyjętą odpowiedź jest potrzebna:

FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <<NewDir>> & GOTO :END 
:END 
+2

Jakie zmiany są niezbędne do obsługi przestrzeni? TYLKO notowania w okolicy "%% I"? – arichards

+0

@arichards - To prawda. – TimH

2

@Chris Noe

należy zauważyć, że przestrzeń w przedniej części & staje się częścią poprzedniego polecenia. To mnie ugryzło SETem, który szczęśliwie umieszcza końcowe wartości w wartości.

Aby obejść przestrzeń końcową dodawaną do zmiennej środowiskowej, zawiń komendę set w parens.

E.g. FOR /F %%I IN ('DIR "*.*" /B /O:D') DO (SET NewestFile=%%I)

+0

Tak, działa, ale standardowym sposobem dla 'SET' jest użycie cudzysłowów takich jak' set "NewestFile = %% I" ' – jeb

+0

który może być twoim standardem, ale mój jest parens ... :-) – Richard

+0

Ale parens nie powiedzie się dla '(set var = & complex ^)' quotes działa 'set "var = & complex ^" ' – jeb

2
@echo off 
set source="C:\test case" 
set target="C:\Users\Alexander\Desktop\random folder" 

FOR /F "delims=" %%I IN ('DIR %source%\*.* /A:-D /O:-D /B') DO COPY %source%\"%%I" %target% & echo %%I & GOTO :END 
:END 
TIMEOUT 4 

Moja próba skopiowania najnowszy plik z folderu

wystarczy ustawić foldery źródłowe i docelowe, a to powinno działać

Ten ignoruje foldery samą troskę tylko z plikami

Zalecono wybór typu pliku na ścieżce DIR zmieniającej się *.* na *.zip na przykład

TIMEOUT nie działa na winXP Myślę, że