Loops 循环的批处理-反向/负?
我试图将许多文件连接成两个单独的文件 第一个文件是文件名中包含bob的所有其他文件的串联。第二个文件将是文件名中没有bob的所有文件的串联。两个文件都将在实际执行连接之前输出文件名 以下是我目前掌握的情况:Loops 循环的批处理-反向/负?,loops,batch-file,for-loop,inverse,Loops,Batch File,For Loop,Inverse,我试图将许多文件连接成两个单独的文件 第一个文件是文件名中包含bob的所有其他文件的串联。第二个文件将是文件名中没有bob的所有文件的串联。两个文件都将在实际执行连接之前输出文件名 以下是我目前掌握的情况: @echo off setlocal EnableDelayedExpansion set bob=All_bob.txt set jimmy=All_jimmy.txt
@echo off
setlocal EnableDelayedExpansion
set bob=All_bob.txt
set jimmy=All_jimmy.txt
if exist %bob% del %bob%
if exist %jimmy% del %jimmy%
for %%a in (*bob*.txt) do (
echo /* >>%bob%
echo * %%a >>%bob%
echo */ >>%bob%
copy/b %bob%+"%%a" %bob%
echo. >>%bob%
echo. >>%bob%)
for %%a not in (*bob*.txt) do (
echo /* >>%jimmy%
echo * %%a >>%jimmy%
echo */ >>%jimmy%
copy/b %jimmy%+"%%a" %jimmy%
echo. >>%jimmy%
echo. >>%jimmy%)
然而,底部的第二个FOR循环不想使用not,并且使用这样的感叹号
for %%a !(*bob*.txt) do (
…也不想工作。那么,如何连接不包含括号内内容的文件呢?我认为没有一个干净的解决方案 您可能可以使用FINDSTR过滤%%a,但这需要将*bob*.txt转换为正则表达式,这可能不容易实现自动化 另一个丑陋的解决方案是使用嵌套循环:
echo bob:
for %%a in (*bob*.txt) do (
echo %%a
)
echo not bob:
for %%a in (*) do (
setlocal ENABLEDELAYEDEXPANSION&set inc=1
for %%b in (*bob*.txt) do if "%%~a"=="%%~b" set inc=0
if "!inc!"=="1" echo %%a
endlocal
)
使用find如何:
for /F %%a in ('dir /b *.txt') do (
echo %%a | find /V "bob")
这将返回所有没有bob的.txt文件。使用findstr和*bob*.txt的正则表达式:
只需使用/V开关处理所有其他文件:
for /f "usebackq delims=" %%a in (`dir /b ^| findstr /v ".*bob.*\.txt"`) do (…)
您可以使用help命令或/?有关详细信息,请切换或查找。
我清除了分隔符delims=以允许在文件名中使用空格。对于这个特定的示例,这很好,但是如果搜索字符串是foobarbaz.txt或b?b怎么办。txt@Anders,likso回答OP问题。只需使用foo.*bar.*baz\.txt或b.b\.txt模式匹配文件搜索foo*bar*baz.txt或b?b.txt:]
for /f "usebackq delims=" %%a in (`dir /b ^| findstr /v ".*bob.*\.txt"`) do (…)