我正在处理批处理文件,我想将最后一个文件复制到目录中。在这种情况下,一个.cmd
文件始终会生成一个新文件。
我做的第一个尝试是使用/T:W
这个东西,它工作得很好。当文件名使用两个(或多个)数字时,就会发生此问题。
for /f %%x in ('dir C:\foldercmd\*.cmd /B /T:W ') do set "cmdFile=%%x"
所以我得到的输出是:
C:\Users\foldercmd>set "cmdFile=cmdWork_1.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_10.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_11.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_12.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_2.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_3.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_4.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_5.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_6.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_7.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_8.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_9.cmd"
我想得到:
C:\Users\foldercmd>set "cmdFile=cmdWork_1.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_2.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_3.cmd"
[...]
C:\Users\foldercmd>set "cmdFile=cmdWork_11.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_12.cmd"
答案 0 :(得分:1)
我将仅通过标题回答这个问题。 获取上次修改的文件
@echo off
for /f "delims=" %%i in ('dir "C:\foldercmd\*.cmd" /b /a-d /o-d') do set "cmdfile=%%i" & goto :end
:end
echo %cmdfile%
这将按顺序对文件*.cmd
进行排序,首先是最新文件,然后仅将第一个文件设置为最新文件并回显它。将新的.cmd
文件添加到该目录后,它将选择新文件。如此简单。
答案 1 :(得分:0)
根据Dir /?
,/O
开关允许您进行排序。如果您要这样做,可以根据上次修改日期使用D
,这样您就可以得到:
Dir /OD
这是您要寻找的吗?
答案 2 :(得分:0)
如果您无法修改文件命名过程,并且仍想使用名称进行排序,则可以使用powershell中的batch-file:
For /F "Delims=" %%A In ('PowerShell -NoP^
"GCI "C:\foldercmd" -Fi "cmdWork_*.cmd"|Sort{If($_ -Match '(\d+)')"^
"{[int]$Matches[1]}}|Select -Exp Name"')Do Set "cmdFile=%%A"
上面的示例循环遍历每个文件,依次set
依次遍历每个文件,直到最后一个文件,但是如果您只想:powershell仅返回最后一个文件:
For /F "Delims=" %%A In ('PowerShell -NoP^
"GCI "C:\foldercmd" -Fi "cmdWork_*.cmd"|Sort{If($_ -Match '(\d+)')"^
"{[int]$Matches[1]}}|Select -Exp Name -L 1"')Do Set "cmdFile=%%A"
答案 3 :(得分:0)
两个纯批处理解决方案,搜索使用的最高数量。
使用计数循环
:: Q:\Test\2019\04\29\SO_55899758.cmd
@Echo off
for /l %%L in (1,1,100) do if not exist "C:\foldercmd\cmdwork_%%L.cmd" (
set /a "No=%%L-1"
goto :Done
)
Echo Highest number is greater 100
Goto :Eof
:Done
echo Highest used number is %No%
pause
在下划线处拆分名称并与前一个进行比较
:: Q:\Test\2019\04\29\SO_55899758_2.cmd
@Echo off & Setlocal EnableDelayedExpansion
set "No=0"
for /f "tokens=2 delims=_." %%L in ('
dir /B "C:\foldercmd\cmdwork_*.cmd"
') do if %%L gtr !No! set "No=%%L"
echo Highest used number is %No%
pause