如何编写 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
现在您可以在 bat 文件的其余部分引用 %NewestFile%。
例如,我们使用以下方法从目录中获取最新版本的数据库 .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
我尝试从文件夹复制最新文件
只需设置源文件夹和目标文件夹就可以了
这个忽略文件夹,只关心文件
建议您在 DIR 路径更改中选择文件类型 *.*
到 *.zip
例如
我认为 TIMEOUT 在 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(假设它们都在同一搜索范围内)。因此,如果您希望它多次工作,您可能必须调整复制的文件编号。