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

<p>мне нужно скопировать самый новый файл в каталоге в новое место. до сих пор я нашел ресурсы по команде <a href="http://www.ss64.com/nt/forfiles.html">forfiles</a> , здесь <a href="https://stackoverflow.com/q/51837">вопрос, связанный с датой</a> , и другой <a href="https://stackoverflow.com/q/50902">вопрос по теме</a> . у меня просто проблемы с соединением частей! как мне скопировать самый новый файл в этом каталоге в новое место?</p>

<p>windows shell, один вкладыш:</p><pre><code>for /f %%i in ('dir *.* /b /o:-d') do copy %%i <<newdir>> & exit </code></pre>

<p>принятый ответ дает пример использования новейшего файла в команде, а затем выхода. если вам нужно сделать это в файле bat с другими сложными операциями, вы можете использовать следующее для сохранения имени файла самого нового файла в переменной:</p><pre><code>for /f "delims=|" %%i in ('dir "*.*" /b /o:d') do set newestfile=%%i </code></pre><p>теперь вы можете ссылаться на% newestfile% в остальной части вашего файла bat.</p><p>например, вот что мы используем, чтобы получить последнюю версию .bak-файла базы данных из каталога, скопировать его на сервер и затем восстановить базу данных:</p><pre><code>: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" </code></pre>

<p>чтобы позволить этому работать с именами файлов, используя пробелы, необходима измененная версия принятого ответа:</p><pre><code>for /f "delims=" %%i in ('dir . /b /o:-d') do copy "%%i" <<newdir>> & goto :end :end </code></pre>

<p>@chris noe</p><blockquote> <p>обратите внимание, что пробел перед & становится частью предыдущей команды. это укусило меня с set, который счастливо помещает пробелы в стоимость.</p> </blockquote><p>чтобы обойти конечное пространство, добавляемое к переменной окружения, оберните команду set в parens.</p><p>например. <code>for /f %%i in ('dir "*.*" /b /o:d') do (set newestfile=%%i)</code></p>

<pre><code>@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 </code></pre><p>моя попытка скопировать самый новый файл из папки</p><p>просто установите ваши исходные и целевые папки, и это должно работать</p><p>этот игнорирует папки, относится только к файлам</p><p>рекомендуется выбрать тип файла в пути dir, изменив, например, <code>*.*</code> на <code>*.zip</code></p><p>я думаю, что тайм-аут не будет работать на winxp</p>

<p>я знаю, что вы просили windows, но думали, что я все равно добавлю это, в unix/linux вы можете сделать:</p><pre><code>cp `ls -t1 | head -1` /somedir/ </code></pre><p>который будет перечислять все файлы в текущем каталоге, отсортированные по времени изменения, а затем скопировать самые последние в/somedir /</p>

<p>откроется второе окно cmd.exe. если вы хотите, чтобы он исчез, замените/k на/c.</p><p>очевидно, замените new\_file\_loc тем, каким будет ваше новое местоположение файла.</p><pre><code>@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 </code></pre>