Как мне написать пакетный скрипт Windows для копирования самого нового файла из каталога?

StackOverflow https://stackoverflow.com/questions/97371

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Оболочка Windows, один вкладыш:

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

Другие советы

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

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

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

Например, вот что мы используем, чтобы получить последнюю версию файла database .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"

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

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

@Крис Ноэ

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

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

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

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

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

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

После этого откроется второе окно 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
@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

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

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

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

Рекомендуется, чтобы вы выбрали filetype в изменении пути к каталогу *.* Для *.zip например

ТАЙМ-аут, я думаю, не сработает на WinXP

Удар:

 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. скопируйте результирующее значение

Важный

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top