如何在 cmd 中跳过 运行 时间内更改的行数?

How to skip number of lines that changed in run time in cmd?

我有很多文件夹,我需要从任何文件夹中删除其中最旧的文件,我需要删除的文件数量在任何迭代中都发生了变化,所以我尝试做一个 for 循环,在任何迭代中进行日期排序,在文件顶部最旧的文件之后我做了 "skip=variable" 这个变量改变了任何迭代并且它不起作用。

有人知道如何在批处理文件中解决这个问题吗? 谢谢!

我对您的 "one-line-code" 进行了以下更改:

  • 重新格式化为正确且可读的批处理文件

  • 使用numOfOFiles作为延迟变量(你把它作为一个字符串来做,这是行不通的)

  • 将所有 paths/filenames 括在引号中以正确处理目录或文件名中的空格

  • 出于同样的原因添加了 delims=
  • 如果输出令您满意,请删除 ECHO

(仅修改过的代码,没有检查是否正确,你想要什么)

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1,2 delims= " %%i in (C:\folder\varibales_file.txt) do (
  set numOfFiles=%%j
  pushd %%i 
  for /f "skip=!numOfFiles! delims=" %%F in ('dir "C:\folder_path_to_delete\%%i" /b /o-d') do (
    ECHO rd /s /q "C:\folder_path_to_delete\%%i\%%F"
  popd
) 

您确定要使用 rd(删除目录),而不是 del(删除文件)吗?

for /F 命令的选项("skip... delims... tokens" 等)在解析 for /F 命令后不能更改。您需要在不同的子程序中更改 "skip=!numOfFiles!" 的值,因此每次执行时都会解析 for /F 命令:

@echo off
setlocal EnableDelayedExpansion

FOR /F "tokens=1,2 delims= " %%i in ( C:\folder\varibales_file.txt ) do (
   set numOfFiles=%%j
   pushd %%i
   call :Sub !numOfFiles!
   popd
)
goto :EOF


:Sub numOfFiles
for /f "skip=%1 delims=" %%F in ('dir "C:\folder_path_to_delete\%%i" /b /o-d') do (
   rd /s /q "C:\folder_path_to_delete\%%i\%%F"
)