Muszę skopiować najnowszy plik w katalogu do nowej lokalizacji. Do tej pory znalazłem zasoby na komendzie forfiles, date-related question tutaj i innym related question. Po prostu mam trochę problemów ze złożeniem kawałków! Jak skopiować najnowszy plik z tego katalogu do nowego miejsca?Jak napisać skrypt wsadowy Windows, aby skopiować najnowszy plik z katalogu?
Odpowiedz
powłoki systemu Windows, jedna wkładka:
FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT
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/
Nie oczekiwałem tej odpowiedzi w tym poście. Dziękuję Ci bardzo. – Mrk
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
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ł:
- lista wszystkich plików w {time} {plik} format.
- sortować je według czasu
- dostać ostatni
- odciąć czas, a odstępy od początku/końca
- 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.
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"
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
Twoje powitanie, cieszę się, że mogę pomóc =). –
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ć. –
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
@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)
Tak, działa, ale standardowym sposobem dla 'SET' jest użycie cudzysłowów takich jak' set "NewestFile = %% I" ' – jeb
który może być twoim standardem, ale mój jest parens ... :-) – Richard
Ale parens nie powiedzie się dla '(set var = & complex ^)' quotes działa 'set "var = & complex ^" ' – jeb
@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
To prawdopodobnie powinno być wyjście/b lub goto: eof, aby uniknąć zamknięcia okna cmd ... – Joey
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
Zwróć uwagę, że spacja przed & staje się część poprzedniego polecenia. To mnie ugryzło SETem, który szczęśliwie umieszcza spacje w wartości. –