Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 循环的批处理-反向/负?_Loops_Batch File_For Loop_Inverse - Fatal编程技术网

Loops 循环的批处理-反向/负?

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

我试图将许多文件连接成两个单独的文件

第一个文件是文件名中包含bob的所有其他文件的串联。第二个文件将是文件名中没有bob的所有文件的串联。两个文件都将在实际执行连接之前输出文件名

以下是我目前掌握的情况:

            @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 (…)