如何在 Find on cmd.exe 或 Powershell 中合并 If 语句

How to incorporate If statement in Find on cmd.exe or Powershell

我有一个包含多行信息的记录器文件。我想创建一个脚本,仅当以下行不是“::Calling subInACL”时,它才能找到包含“::Directory”的所有行 --> 将所有找到的行放入文本文件中。

如果有时间戳,则换行。

特定帐户(即 xx1)的 SubinACL 行将始终跟在“::Directory”行之后。所以我真正需要的只是一个代码,用于检查“::Directory”行之后的行是否以“::Calling”开头。如果是,请不要将其包含在输出中。

EX:如果记录器文件包含

10:03:11 AM::Directory \aaa.yyy.com\ABC\Chem\xx1 created successfully.
10:03:11 AM::Calling subInACL (for ownership) with arguments:  /file \025.aaa.yyy.com\Home10\Chem\xx1 /setowner=aaa\xx1
10:03:11 AM::Calling subInACL (for perms) with arguments:  /file \025.aaa.yyy.com\Home10\Chem\xx1 /grant=aaa\xx1=C
10:03:12 AM::Directory \025.aaa.yyy.com\Home10\Chem\xx1 given ACLs successfully.
10:16:15 AM::Directory \aaa.yyy.com\ABC\Civil\xx2 created successfully.
10:16:48 AM::Directory \aaa.yyy.com\ABC\Civil\xx3 created successfully.
10:16:48 AM::Directory \aaa.yyy.com\ABC\Civil\xx4 created successfully.

我需要它 return 目录路径

10:16:15 AM::Directory \aaa.yyy.com\ABC\Civil\xx2 created successfully.
10:16:48 AM::Directory \aaa.yyy.com\ABC\Civil\xx3 created successfully.
10:16:48 AM::Directory \aaa.yyy.com\ABC\Civil\xx4 created successfully.

因为他们还没有为他们的帐户创建 "subInACL"。当没有为帐户创建 "subinACL" 时,这是一个错误,所以我需要找到所有没有创建它的帐户。

我知道我可以使用

find "::Directory" logger.txt > found.txt

但是这 return 全部是“::Directory”行。我如何合并一个 IF 语句或正则表达式,其中只有 return 那些没有“::Calling subInACL”的语句或正则表达式如下一行。我可以直接在 cmd 行上执行此操作而不调用批处理文件 运行 吗?我知道我也可以使用 Powershell .. 如果这样更容易?

我在 Windows 上使用 cmd.exe。

这在 awk 等工具中最容易处理,但只要付出足够的努力,也可以在 cmd shell 脚本中完成。 ENABLEDELAYEDEXPANSION 是解决方案的关键。您需要能够在 FOR 循环中使用变量。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET WAITING_FOR_NEXT_LINE=0

FOR /F "usebackq tokens=*" %%s IN (`TYPE log.txt`) DO (
    SET V=%%s
    SET LOOKING_FOR=!V:~11,12!

    IF !WAITING_FOR_NEXT_LINE! EQU 1 (
        IF "!V:~11,10!" NEQ "::Calling " (
            ECHO !LAST_LINE!
        )
    )

    SET WAITING_FOR_NEXT_LINE=0

    IF "!LOOKING_FOR!" EQU "::Directory " (
        SET LAST_LINE=%%s
        SET WAITING_FOR_NEXT_LINE=1
    )
)

IF %WAITING_FOR_NEXT_LINE% EQU 1 (ECHO %LAST_LINE%)

EXIT /B 0

您需要知道下一行应该将上一行推出。同样重要的是,找到后需要重新设置。

C:>logprocessor.bat
10:03:12 AM::Directory \025.aaa.yyy.com\Home10\Chem\xx1 given ACLs successfully.
10:16:15 AM::Directory \aaa.yyy.com\ABC\Civil\xx2 created successfully.
10:16:48 AM::Directory \aaa.yyy.com\ABC\Civil\xx3 created successfully.
10:16:48 AM::Directory \aaa.yyy.com\ABC\Civil\xx4 created successfully.

如果要省略 ACL 行,请在行尾添加测试。

IF !WAITING_FOR_NEXT_LINE! EQU 1 (
    IF "!V:~11,10!" NEQ "::Calling " (
        IF "!LAST_LINE:~-21!" EQU "created successfully." (
            ECHO !LAST_LINE!
        )
    )
)
@echo off
setlocal EnableDelayedExpansion

set "prevLine="
for /F "tokens=1-3*" %%a in (logger.txt) do (
   set "word=%%b"
   if "!word:~-9!" neq "::Calling" (
      if defined prevLine echo !prevLine!
      for %%x in ("%%c") do set "thisAcc=%%~Nx"
      if "!thisAcc!" equ "!badAcc!" (
         set "prevLine="
      ) else (
         set "prevLine=%%a %%b %%c %%d"
      )
      set "badAcc="
   ) else (
      set "prevLine="
      set "badAcc=!thisAcc!"
   )
)
if defined prevLine echo !prevLine!

输出:

10:16:15 AM::Directory \aaa.yyy.com\ABC\Civil\xx2 created successfully.
10:16:48 AM::Directory \aaa.yyy.com\ABC\Civil\xx3 created successfully.
10:16:48 AM::Directory \aaa.yyy.com\ABC\Civil\xx4 created successfully.