用于删除"复制"的批处理脚本档

时间:2017-01-12 15:08:38

标签: batch-file

我有一个名为的文件列表:

file.txt
file (1).txt
file (2).txt
     

更大(数字)是最新更新的文件。

我想要一个.bat脚本,允许将file (maxnumer).txt的内容转换为file.txt

2 个答案:

答案 0 :(得分:4)

dir /B /OD /TW file*.txt按上次写入时间的排序顺序列出文件名(参见dir /?)。

下一个评论的批处理脚本可以为您完成这项工作:

@echo OFF
SETLOCAL EnableExtensions
rem delete empty `_lastfile` variable
set "_lastfile="
rem store file name of last written time into `_lastfile` variable
for /F "delims=" %%G in ('dir /B /OD /TW file*.txt 2^>NUL') do set "_lastfile=%%~G"
rem                                                ↑↑↑↑↑↑ suppress errors
rem check the `_lastfile` variable
rem is defined?
rem                  AND is different from "file.txt"?
if defined _lastfile if /I "%_lastfile%" NEQ "file.txt" copy /Y "%_lastfile%" "file.txt"

资源(必读):

答案 1 :(得分:1)

这是一个hacky的答案。

此脚本会将所有文件从file (1).txt移至file (10).txt至file.txt,只留下file.txt,该文件现在包含文件(10)中的文本.txt

按升序执行此操作将确保存在的最高编号是最后一个要移动的编号。

@echo off
set /P name=Enter name of file without extension: 
echo enter extension:
set /P ext=.
echo. & echo.
echo these actions will be performed: & echo.
FOR /L %%A IN (1,1,10) DO @echo move /y "%name% (%%A).%ext%" "%name%.%ext%"
echo. & pause & echo.
FOR /L %%A IN (1,1,10) DO       move /y "%name% (%%A).%ext%" "%name%.%ext%"
pause

您可以使用IF EXIST %name% (%%A).%ext%阻止脚本尝试移动不存在的文件,但它并没有真正影响任何事情,所以我没有打扰

上面的脚本将针对特定的命名文件执行此操作。要对目录中的所有文件执行此操作,这里有一些提示可以帮助您前进

使用dir /b >filenames.txt获取文本文件中列出的目录中的所有文件

为文本文件中的每一行执行操作

for /f "usebackq delims= tokens=* %%a in (`filenames.txt`)" DO (
    ::some stuff here
)

我想要的方法是获取filenames.txt,手动删除所有(n)文件,这样你就可以得到一个"非重复"的列表。文件名,并将其用作输入。你

那里可能有更优雅的解决方案,但由于批次的所有特点,我发现页面和页面很长都不会感到惊讶。

如果你想保留所有原始文件不仅仅是最终的file.txt而没有副本,那么我想使用COPY

如果要保留所有原始文件,则需要使用COPY而不是MOVE。

在这种情况下,要删除所有多余的操作(即只复制编号最高的文件,而不是按顺序复制所有文件),然后在您的(现在的多行)中使用IF NOT EXIST %name% (!B!).%ext% !B!=%%A+1之类的内容循环并使用Setlocal EnableDelayedExpansion启用算法正常工作。但它并不是真的必要,复制1,然后是2,然后是3,然后4会做同样的事情,如果比跳过1 2和3并且只做4就慢一点。

我希望这足以帮助您指出正确的方向,如果不清楚,请随时提问。