Как мне написать пакетный скрипт Windows для копирования самого нового файла из каталога? - PullRequest
64 голосов
/ 19 сентября 2008

Мне нужно скопировать самый новый файл в каталоге в новое место. До сих пор я нашел ресурсы для команды forfiles , вопроса о дате здесь и другого вопроса . У меня просто проблемы с соединением частей! Как мне скопировать самый новый файл в этом каталоге в новое место?

Ответы [ 8 ]

124 голосов
/ 11 июня 2009

Принятый ответ дает пример использования новейшего файла в команде, а затем выхода. Если вам нужно сделать это в файле bat с другими сложными операциями, вы можете использовать следующее для сохранения имени файла самого нового файла в переменной:

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

Теперь вы можете ссылаться на% NewestFile% в остальной части вашего файла bat.

Например, вот что мы используем, чтобы получить последнюю версию .bak-файла базы данных из каталога, скопировать его на сервер и затем восстановить базу данных:

: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"
67 голосов
/ 19 сентября 2008

Windows shell, один вкладыш:

FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT
11 голосов
/ 22 февраля 2011

Чтобы это работало с именами файлов, используя пробелы, необходима измененная версия принятого ответа:

FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <<NewDir>> & GOTO :END
:END
3 голосов
/ 29 июня 2011

@ Крис Ноу

Обратите внимание, что пробел перед & становится частью предыдущей команды. Это укусило меня с помощью SET, который радостно ставит конечные пробелы в значение.

Чтобы обойти конечный пробел, добавляемый в переменную окружения, оберните команду set в parens.

например. FOR /F %%I IN ('DIR "*.*" /B /O:D') DO (SET NewestFile=%%I)

2 голосов
/ 20 ноября 2014
@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

Моя попытка скопировать самый новый файл из папки

просто установите ваши исходные и целевые папки, и это должно работать

Этот игнорирует папки, относится только к файлам

Рекомендуется выбрать тип файла в пути DIR, изменив *.* на *.zip, например

TIMEOUT не будет работать на winXP, я думаю

2 голосов
/ 19 сентября 2008

Откроется второе окно cmd.exe. Если вы хотите, чтобы он исчез, замените / K на /C.

Очевидно, замените new_file_loc тем, каким будет ваше новое местоположение файла.

@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 голосов
/ 19 сентября 2008

Я знаю, что вы просили Windows, но думали, что я все равно добавлю это, в Unix / Linux вы можете сделать:

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

, который будет перечислять все файлы в текущем каталоге, отсортированные по времени модификации, а затем cp самые последние в / somedir /

0 голосов
/ 19 сентября 2008

Bash:

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

где "newestfile" станет самым новым файлом

альтернативно, вы можете сделать newdir / STR или просто newdir

Распределение:

  1. перечислить все файлы в формате {time} {file}.
  2. отсортировать их по времени
  3. получить последний
  4. отрезать время и пробелы от начала / конца
  5. скопировать результирующее значение

Важно

После запуска этого файла самым новым файлом будет то, что вы только что скопировали. Поэтому вам, возможно, придется настроить номер файла, который вы копируете, если хотите, чтобы это работало более одного раза.

...