如何将许多Powershell脚本合并为一个



我有这个脚本

Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
function Hide-Console
{
$consolePtr = [Console.Window]::GetConsoleWindow()
#0 hide
[Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console
$docs = [environment]::GetFolderPath("MyDocuments")
$zwift = "$docsZwift"                  # Zwift data directory
$log = "$zwiftLogsLog.txt"            # Path to Zwift log file
$output = "$zwiftLogsGroupEvents.txt"  # File to write output to
$delay = 6000                           # Delay in ms between updates of the file
Function Write-SlowOutput {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true,
HelpMessage="How long to pause for (ms)")]
[int32]$waitFor,
[Parameter(Mandatory=$false,
HelpMessage="File to output to")]
[string]$outputFile,
[Parameter(ValueFromPipeline)]
[Object]$input
)
BEGIN {}
PROCESS {
Write-Host $input
if ($outputFile) {
Out-File -Encoding UTF8 -FilePath $outputFile -InputObject $input
}
Start-Sleep -Milliseconds $waitFor
}
END {}
}
Get-Content -Tail 0 -Wait -Encoding "UTF8" $log | 
Select-String "GroupEvents: Linedup for group (.*), subgroup" |
% {$_.matches.groups[1].value} |
Write-SlowOutput -outputFile $output -waitFor $delay

这个脚本查看我的游戏日志文件,并根据选择字符串行提取一些文本

Select-String "GroupEvents: Linedup for group (.*), subgroup" |

预期输出是一个简单的文本短语或句子,如Group Run。但文本输出究竟是什么并不重要

我有多个运行该脚本的实例,每个实例在日志文件中查找不同的行并输出不同的文本行。所有这些都指向同一个输出文件。基本上,找到的最新一行覆盖了前一行,这正是我所需要的。

那么,我该如何重写这个脚本,这样我就不需要运行多个实例了?例如

Select-String "GroupEvents: Linedup for group (.*), subgroup" |
Select-String "Workout(.*)" |
Select-String "GroupEvents: Started in group (.*), subgroup" |
Select-String "Run Device Selected: (.*)" |

我希望脚本搜索这些字符串中的每一个,并简单地将日志文件中找到的最新字符串输出到输出文件中。

我试过只复制最后三行代码,但没有成功。我不是一个程序员(很明显!(所以只是最好的猜测和使用试错。

非常感谢您的帮助。

更新的答案:我正在解决您现在实际提出的问题,即"如何在同一输入上使用不同模式调用Select-String?">

每次发现新的日志条目时,它都会将所有新条目传递到For-Each循环中。然后,我们可以将当前对象($_(作为管道对象传递到函数ProcessLog中。ProcessLog将使用Select-String为每个模式测试输入,并将项目传递给Write-SlowOutput函数。

$log = "test.log"
$output = "output.log"
$patterns = @("GroupEvents: Linedup for group (.*), subgroup", 
"Workout(.*)", 
"GroupEvents: Started in group (.*), subgroup", 
"Run Device Selected: (.*)")
function ProcessLog {
[CmdletBinding()] Param([Parameter(ValueFromPipeline)]$item)
Write-Output "Running with $item"
foreach($pattern in $patterns)
{
$save = (Select-String -InputObject $item -Pattern $pattern | % { $_.Matches.Groups[1].Value })
if(-not [string]::IsNullOrWhitespace($save))
{
$save.Trim('(').Trim(')') | Set-Content $output
return
}
}
}
Get-Content -Tail 0 -Wait -Encoding "UTF8" $log | % { $_ | ProcessLog }

我使用Set-Content成功地测试了这一点,以写入输出文件,所以我只需要假设它将与您的Write-SlowOutput函数一起正常工作。

相关内容

最新更新