我想编写一个windows shell命令,该命令遍历包含20个文件的文件夹中的所有文件:
InputFile1.csv
InputFile2.csv
InputFile3.csv
InputFile4.csv
...
InputFile20.csv
我要删除文件号大于5的所有文件。这意味着只有InputFile1
到InputFile4
应保留在文件夹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中使用此命令。
提前致谢。
答案 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"