Как мне написать пакетный скрипт Windows для копирования самого нового файла из каталога?
-
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
Разбивка:
- перечислите все файлы в формате {time} {file}.
- отсортируйте их по времени
- возьми последний
- отрежьте время и пробелы от начала / конца
- скопируйте результирующее значение
Важный
После запуска этого один раз самым новым файлом будет тот, который вы только что скопировали : p ( при условии, что они оба находятся в одной и той же области поиска ).Таким образом, вам, возможно, придется настроить номер файла, который вы копируете, если вы хотите, чтобы это сработало более одного раза.