web-dev-qa-db-ja.com

ディレクトリから最新のファイルをコピーするWindowsバッチスクリプトを作成するにはどうすればよいですか?

ディレクトリ内の最新のファイルを新しい場所にコピーする必要があります。これまでのところ、 forfiles コマンド、 日付関連の質問 ここ、および別の 関連質問 に関するリソースを見つけました。ピースをまとめるのにちょっと苦労しています!そのディレクトリ内の最新のファイルを新しい場所にコピーするにはどうすればよいですか?

67
Devrin

Windowsシェル、ライナー1つ:

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

受け入れられた回答は、コマンドで最新のファイルを使用して終了する例を示しています。他の複雑な操作を含むbatファイルでこれを行う必要がある場合は、次を使用して最新のファイルのファイル名を変数に保存できます。

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

これで、残りのbatファイル全体で%NewestFile%を参照できます。

たとえば、ディレクトリからデータベース.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"
127
Chris Magnuson

スペースを使用してファイル名でこれを機能させるには、受け入れられた回答の修正バージョンが必要です。

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

@クリス・ノエ

&の前のスペースは、前のコマンドの一部になることに注意してください。 SETを使用すると、値に末尾の空白が追加されます。

環境変数に追加される末尾スペースを回避するには、setコマンドを括弧で囲みます。

例えば。 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

フォルダーから最新のファイルをコピーしようとした

ソースとターゲットのフォルダを設定するだけで動作するはずです

これはフォルダを無視し、ファイルのみに関心があります

*.*から*.Zip 例えば

タイムアウトはwinXPでは機能しません

2
DoTheEvo

あなたがWindowsを要求したことは知っていますが、とにかくこれを追加すると思いました、Unix/Linuxでは次のことができます:

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

これは、現在のディレクトリ内のすべてのファイルを変更時刻でソートしてリストし、最新のものを/ somedir /にcpします

2
Robert Swisher

これにより、2番目の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