it-swarm.com.ru

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

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

64
Devrin

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

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

Принятый ответ дает пример использования новейшего файла в команде, а затем выхода. Если вам нужно сделать это в файле 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"
124
Chris Magnuson

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

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

@Chris Noe

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

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

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

3
Richard
@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

Я думаю, что тайм-аут не будет работать на winXP

2
DoTheEvo

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

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

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

2
Robert Swisher

Откроется второе окно 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
moswald