从for循环的输出中删除特定文件名

问题描述 投票:0回答:2

我有各种文件日期明确:

cpms_2015_09_01.txt

lms_2015_07_10.txt

kmps_2015_10_07.txt

lmps_2015_10_07.txt

cpmgs_2015_10_07.txt

我想从今天日期名称的“for循环”文件中删除我该怎么做,我写了一个代码,我可以将所有文件的文件路径存储在:

XCOUNT_1=D:\check\cpms_2015_09_01.txt ...etc

但是,今天的文件名不应该没有XCOUNT,例如%_2015_10_07%

我对下面这段代码感到震惊

DO ( IF  NOT "_%year%_%day%_%month%.txt"=="!FTRIM_%%J!"

我的代码如下

SETLOCAL ENABLEDELAYEDEXPANSION
setlocal
SET /A MAXJ=1
SET /A J=1
echo %DATE%

set year=%date:~-4,4% 
set year=%year: =%
set month=%date:~7,2%
set month=%month: =%
set day=%date:~4,2%
set day=%day: =%

FOR /F "usebackq tokens=*" %%i IN (`DIR /S /B D:\check\*.txt`) DO ( IF  NOT "_%year%_%day%_%month%.txt"=="!FTRIM_%%J!" (

    SET XCOUNT_!J!=%%~i
    SET FNAME_!J!=%%~ni
    SET MAXJ=!J!
    SET /A J+=1
    SET FTRIM_!nxi!=%%~nxi:~-10,10%

PAUSE
)
)
batch-file for-loop cmd
2个回答
1
投票
C:\Users\pwatson\bin>type atest.bat
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A J=1
SET /A MAXJ=0
FOR /F "usebackq tokens=*" %%i IN (`DIR /S /B C:\Python27-32\*.exe`) DO (
    SET XCOUNT_!J!=%%~i
    SET MAXJ=!J!
    SET /A J+=1
)
SET XCOUNT

这会产生:

C:\Users\pwatson\bin>call atest.bat
XCOUNT_1=C:\Python27-32\python.exe
XCOUNT_10=C:\Python27-32\Lib\site-packages\pip\_vendor\distlib\t64.exe
XCOUNT_11=C:\Python27-32\Lib\site-packages\pip\_vendor\distlib\w32.exe
XCOUNT_12=C:\Python27-32\Lib\site-packages\pip\_vendor\distlib\w64.exe
XCOUNT_13=C:\Python27-32\Lib\site-packages\setuptools\cli-32.exe
XCOUNT_14=C:\Python27-32\Lib\site-packages\setuptools\cli-64.exe
XCOUNT_15=C:\Python27-32\Lib\site-packages\setuptools\cli-arm-32.exe
XCOUNT_16=C:\Python27-32\Lib\site-packages\setuptools\cli.exe
XCOUNT_17=C:\Python27-32\Lib\site-packages\setuptools\gui-32.exe
XCOUNT_18=C:\Python27-32\Lib\site-packages\setuptools\gui-64.exe
XCOUNT_19=C:\Python27-32\Lib\site-packages\setuptools\gui-arm-32.exe
XCOUNT_2=C:\Python27-32\pythonw.exe
XCOUNT_20=C:\Python27-32\Lib\site-packages\setuptools\gui.exe
XCOUNT_21=C:\Python27-32\Scripts\easy_install-2.7.exe
XCOUNT_22=C:\Python27-32\Scripts\easy_install.exe
XCOUNT_23=C:\Python27-32\Scripts\pip.exe
XCOUNT_24=C:\Python27-32\Scripts\pip2.7.exe
XCOUNT_25=C:\Python27-32\Scripts\pip2.exe
XCOUNT_3=C:\Python27-32\w9xpopen.exe
XCOUNT_4=C:\Python27-32\Lib\distutils\command\wininst-6.0.exe
XCOUNT_5=C:\Python27-32\Lib\distutils\command\wininst-7.1.exe
XCOUNT_6=C:\Python27-32\Lib\distutils\command\wininst-8.0.exe
XCOUNT_7=C:\Python27-32\Lib\distutils\command\wininst-9.0-amd64.exe
XCOUNT_8=C:\Python27-32\Lib\distutils\command\wininst-9.0.exe
XCOUNT_9=C:\Python27-32\Lib\site-packages\pip\_vendor\distlib\t32.exe

将这些重新带回父环境是另一个问题。我希望dbenham可能会做出回应。


1
投票

首先,除非告诉批处理命令停止并且下一个命令开始,否则不能将所有代码放在同一行上。其次,您拥有的代码只能在命令提示符下工作,而不能在批处理文件中工作,因为在批处理文件中使用%循环变量时需要两个fors。第三,set /a仅用于数学;存储字符串值时使用常规set命令。

最后(也是最重要的),您需要延迟扩展才能在for循环内正确迭代计数器变量。

此批处理脚本应该工作:

@echo off
setlocal enabledelayedexpansion

set J=1
for /R "D:\TEST" %%I in (*.txt) do (
    set XCOUNT_!J!=%%I
    set /a J+=1
)

如果要从输出中排除特定文件,请将set代码包装在if语句中。

@echo off
setlocal enabledelayedexpansion

set J=1
for /R "D:\TEST" %%I in (*.txt) do (
    if not "%%~nxI"=="test.txt" (
        set XCOUNT_!J!=%%I
        set /a J+=1
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.