Windows shell命令用于删除大于n的编号文件

时间:2014-11-16 22:43:43

标签: batch-file for-loop

我想编写一个windows shell命令,该命令遍历包含20个文件的文件夹中的所有文件:

InputFile1.csv
InputFile2.csv
InputFile3.csv
InputFile4.csv
...
InputFile20.csv

我要删除文件号大于5的所有文件。这意味着只有InputFile1InputFile4应保留在文件夹C:\ tmp \ out

我写了这个命令:

FOR /R  C:\tmp\out\ %G IN (*) DO 
  FOR /F  %H IN ("%~nG") DO 
    (SET str="%H" && SET lastdigits=%str:~10,2% && IF %lastdigits% GTR 5 del %G) 

结果,在命令提示符下,我得到了文件夹中的每个文件:

C:\tmp\out>(SET str="InputFile1"   && SET lastdigits= 9   && IF 9 GTR 4 del C:\tmp\out\VisInputFile1.csv )
.......
......
C:\tmp\out>(SET str="InputFile9"   && SET lastdigits= 9   && IF 9 GTR 4 del C:\tmp\out\InputFile9.csv )

并删除所有文件。

为什么lastdigits总是9?

这需要是一个shell命令,因为我想在BPEL-Activity中使用此命令。

提前致谢。

2 个答案:

答案 0 :(得分:1)

cmd /q /e:on /c "(for /l %a in (1 1 4) do set "inputFile%a=1")&for %a in (inputfile*.csv) do if defined %~na (echo keep "%a") else (echo del "%a")"

它只为每个要保留的文件名定义一个变量,然后遍历文件列表,检查是否定义了具有相同名称的变量。如果已定义,请保留文件,否则删除该文件。它相当于

for /l %a in (1 1 4) do set "inputFile%a=1"
for %a in (inputfile*.csv) do if defined %~na (
    echo keep "%a"
) else (
    echo del "%a"
)

但是在一行

对于文件号

的子字符串操作和数字测试
cmd /q /e:on /v:on /c "for %a in (inputfile*.csv) do (set "n=%~na" & set /a "n=!n:~9!">nul & (if !n! gtr 4 (set "n=") else if !n! lss 1 (set "n=")) & if defined n (echo KEEP "%a") else (echo del "%a"))"

为此,当文件编号的值在块内提取并在同一块内处理时,需要延迟扩展。

相当于

setlocal enableextensions enabledelayedexpansion
for %a in (inputfile*.csv) do (
    set "n=%~na" 
    set /a "n=!n:~9!">nul 
    if !n! gtr 4 (
        set "n="
    ) else if !n! lss 1 (
        set "n="
    )
    if defined n (echo KEEP "%a") else (echo del "%a")

在这两种情况下,删除操作仅回显到控制台。如果输出正确,请删除前缀为echo

del命令

已编辑(再次,我理解错误的方式)适应评论:处理两个范围并删除文件1-5,15-20

第一个代码

cmd /q /e:on /c "(for %a in (1 2 3 4 5 15 16 17 18 19 20) do set "inputFile%a=1")&for %a in (inputfile*.csv) do if not defined %~na (echo keep "%a") else (echo del "%a")"

第二个代码

cmd /q /e:on /v:on /c "for %a in (inputfile*.csv) do (set "n=%~na" & set /a "n=!n:~9!">nul & set "delete=" & (if !n! leq 5 (set "delete=1") else if !n! leq 20 if !n! geq 15 set "delete=1") & if defined delete (echo del "%a") else (echo KEEP "%a"))"

答案 1 :(得分:0)

因为您使用批处理文件标记发布了我给您一个批处理命令,您可以从命令行运行,并且如果PowerShell需要,您将知道如何修改它。

以下代码将删除您要执行的文件。它只是设置var G = 5,然后在每次迭代时将数字递增1,直到处理G = 20,然后停止。每次迭代时,G var都会增加文件名中的数字。

这只是回显文件,所以你可以看到它的工作原理。将ECHO更改为DEL以删除文件。

    FOR /L %G IN (5,1,20) DO ECHO "C:\tmp\out\InputFile%G.csv"

如果您是从批处理文件中运行它,请使用@echo off并将%标记加倍,如此

    @echo off
    FOR /L %%G IN (5,1,20) DO ECHO "C:\tmp\out\InputFile%%G.csv"