我有一段脚本,目前在删除它们之前,通过文件'处理'所有文件的目录运行:
for %%x in (*.J_E, *.J_T, *.J_I, *.bcc) do (
"%%x"=="*.exe" (
set /a count=count+1
set choice[!count!]=%%x
)
echo.
::convert files
md %FreshDate%\%FreshTime%
for /l %%x in (1,1,!count!) do (
echo %%x. !choice[%%x]!
tlv2txt !choice[%%x]! > %FreshDate%\%FreshTime%\!choice[%%x]!.txt
del !choice[%%x]!
)
需要此处理的文件列表几乎每周都在增长,我认为处理除少数文件(.dll,* .exe和* .bat)之外的所有文件可能更容易
我尝试在上面的示例开头替换此行:
for %%x in (*.J_E, *.J_T, *.J_I, *.bcc) do (
用这个:
for %%x in (*) do if not "%%x=="*.dll" if not "%%x"=="*.bat" if not "%%x"=="*.exe" (
但我能做的就是删除目录中的所有内容 - 包括运行脚本的批处理文件!
有人可以帮忙吗? 非常感谢
答案 0 :(得分:2)
您的if
构造无效。批量if
非常基础。
使用另一种方法:echo
文件的扩展名,并使用findstr
检查字符串是否不是(/v
)给定的一个。
for %%A in (*) do (
echo %%~xA|findstr /v /x ".dll .bat .exe" && (
tlv2txt %%A > %FreshDate%\%FreshTime%\%%~nA.txt
)
)
答案 1 :(得分:1)
@echo off
setlocal EnableDelayedExpansion
set "exclude=.dll.exe.bat."
for %%x in (*) do if "!exclude:%%~Xx.=!" equ "%exclude%" (
echo %%x
tlv2txt %%x > %FreshDate%\%FreshTime%\%%~Nx.txt
del %%x
)
在此方法中,文件的扩展名与排除的扩展名列表进行比较,方式非常简单:扩展名从列表中删除,因此如果结果相同,则此类扩展名不< / em>在列表中。此方法不使用任何外部命令,例如find
或findstr
,因此运行速度更快。
答案 2 :(得分:0)
包含或排除必须是那么复杂:
:: Inclusion
For /f "Delims=" %%A in (
'Dir /B *.J_E *.J_T *.J_I *.bcc'
) Do tlv2txt "%%A" > "%FreshDate%\%FreshTime%\%%~nA.txt"
:: Exclusion
For /f "Delims=" %%A in (
'Dir /B ^| findstr /i /V ".bat$ .cmd$ .exe$ .dll$" '
) Do tlv2txt "%%A" > "%FreshDate%\%FreshTime%\%%~nA.txt"
答案 3 :(得分:0)
我还会删除不必要的for循环,只需要一个:
If Not Exist "%FreshDate%%FreshTime%\" MD "%FreshDate%%FreshTime%"
For /F "Delims=" %%A In ('Dir/B/A-D^|FindStr/VIE "\.dll \.exe \.bat') Do (
tlv2txt "%%A">"%FreshDate%%FreshTime%\%%~nA.txt" 2>Nul
If Not ErrorLevel 1 Del "%%A"))
请注意,我无法确定%FreshTime%
变量的格式,因为它已从您的代码段中排除。请确保它不包含尾随退格。