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

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

Ответ 1

оболочка Windows, один лайнер:

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

Это откроет второе окно 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

Ответ 6

@Крис Ной

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

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

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

Ответ 7

@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. Думаю,

Ответ 8

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

где "новейший файл" станет новейшим файлом

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

Разбивка:

  • перечислить все файлы в формате {time} {file}.
  • сортировать по времени
  • получить последний
  • отрезать время и пробелы от начала/конца
  • копировать итоговое значение

Важно

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