如何在 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.
我有一个包含多行信息的记录器文件。我想创建一个脚本,仅当以下行不是“::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.