这是我的目标:
我面临的问题:我如何解决各种文件名,每个文件名都包含该日期。如何查看关键字列表并计算每个日志文件中的所有这些单词。如何在单独的文本文件中写出结果。最后有没有办法自动化所有这些?
我想留在PowerShell中或使用Windows批处理文件。
答案 0 :(得分:0)
我担心您的请求不明确,并且有一些遗漏的细节。但是,这是一个批处理文件,其中我猜可能是第一次尝试获得解决方案:
编辑:我修改了原始代码,以便按事件分组文件;第一个代码只是为每个文件分组事件。
@echo off
setlocal EnableDelayedExpansion
rem Push dir to the networked folder
pushd "\\Path\to\networked\folder"
rem Count all file/event combinations in a two-dimensional array
for %%a in (ABC DEF GHI) do (
for /F "delims=:" %%b in ('findstr /I /L "%%a" logFiles*.txt') do (
set /A "count[%%~Nb][%%a]+=1"
)
)
rem Group events for the same file
for /F "tokens=2,3* delims=[]=" %%a in ('set count[') do (
set "file[%%a]=!file[%%a]!, %%b (%%c)"
)
rem Show the final result 1: events per file
(
echo Events per file:
for /F "tokens=2* delims=[]=" %%a in ('set file[') do (
set "line=%%b"
echo %%a.txt = !line:~2!
)
) > result1.txt
rem Group and count files for the same event
for /F "tokens=2,3* delims=[]=" %%a in ('set count[') do (
set "event[%%b]=!event[%%b]!, %%a.txt (%%c)"
set /A "eventCount[%%b]+=%%c"
)
rem Show the final result 2: files per event
(
echo Files per event:
for /F "tokens=2* delims=[]=" %%a in ('set event[') do (
set "line=%%b"
echo "%%a" - !eventCount[%%a]! found in !line:~2!
)
) > result2.txt
答案 1 :(得分:0)
在PowerShell中,我们可以使用Get-Childitem来收集我们想要搜索的文件,并将它们存储在变量中:
$Content = Get-Content (Get-Childitem -Path C:\Temp\*.txt)
将这些文本文件存储到Content变量后,我们只需使用-match regex运算符即可在该文件集合中找到匹配项。
$Content -match "Bacon"
然后您可以使用Out-File输出此信息:
$Content -match "Bacon" | Out-file C:\Temp\Bacon.txt
当然,使用Get-child项目,您可以使用DateTime运算符,并根据需要缩小查询范围,仅查看最近更改的文本文件。
如果你想获得更多的技术,我们可以使用Select-String来获得多个匹配的输出:
Get-ChildItem C:\Logs |
where { $_ | Select-String -Pattern 'Blahblah' } |
where { $_ | Select-String -Pattern '\d{4}' } |
...
你也可以在一行上完成:
gci C:\Logs| select-string -pattern '(Bacon.*Failed)|(Failed.*Steak)'
输出完全取决于你的想象力。一旦它们只是简单的字符串,就可以将它们放入数组或自定义PS对象中以获得良好的输出。它只需要您将运行的命令保存到变量中,然后稍后调用它进行导出。
对于分组,请查看Group-Object cmdlet。它会给你出现数字。