Powershell 工作出人意料地离职了

Powershell 工作出人意料地离职了,powershell,concurrency,start-job,Powershell,Concurrency,Start Job,我想使用Start Job使用Get Content file-Wait-Last 1(-Last 1避免打开整个日志)同时监视(跟踪)多个日志文件 运行gc$file-Last 1-Wait只允许跟踪一个文件。 将其包装在开始作业-Scriptblock中会立即退出作业 我有这样的想法 Start-Job -Name srv1 -ScriptBlock {Get-Content "\\srv1\$log" -Wait -Last 1} | Select-String "matching som

我想使用
Start Job
使用
Get Content file-Wait-Last 1
-Last 1
避免打开整个日志)同时监视(跟踪)多个日志文件

运行
gc$file-Last 1-Wait
只允许跟踪一个文件。 将其包装在
开始作业-Scriptblock
中会立即退出作业

我有这样的想法

Start-Job -Name srv1 -ScriptBlock {Get-Content "\\srv1\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
Start-Job -Name srv2 -ScriptBlock {Get-Content "\\srv2\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
Start-Job -Name srv3 -ScriptBlock {Get-Content "\\srv3\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
Start-Job -Name srv4 -ScriptBlock {Get-Content "\\srv4\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
Start-Job -Name srv5 -ScriptBlock {Get-Content "\\srv5\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}

如何解决这个问题的任何建议?

同时从不同的作业写入同一输出文件将创建竞争条件,除非您有一个调度程序来协调写入访问。此外,如果要从UNC路径读取日志,则需要提供路径为
\\server\share\file

试着这样做:

$servers = 'srv1', 'srv2', 'srv3', 'srv4', 'srv5'
$jobs    = @()

$servers | ForEach-Object {
  $jobs += Start-Job -Name $_ -ScriptBlock {
    Param($server, $log)
    Get-Content "\\$server\share\$log" -Wait -Last 1
  } -ArgumentList $_, 'your.log'
}

while ($jobs.State -contains 'Running') {
  $jobs | Where-Object { $_.hasMoreData } |
    Receive-Job |
    Select-String 'matching some text only' |
    Out-File 'D:\autogrep.log' -Append
  Start-Sleep -Milliseconds 100
}

请注意,如果您仍在使用PowerShell v2,则需要将
$jobs.State
替换为
@($jobs | Select Object-Expand State)
,因为PowerShell在v3之前不会在属性访问时自动展开数组。

感谢单输出文件引用中的提示。为每个服务器手动调用
Start Job
,现在所需的日志可以正常工作。但是,当我尝试在for循环中换装服务器名称时,作业不会按预期启动
foreach($servers中的server){Start Job-Name$server-ScriptBlock{Get Content“\\$server\logfile”-Wait-Last 1 | Select String“仅匹配某些文本”{124; Out File D:\$server.log}}
I在Win7/5.0 RTM上要能够在脚本块中使用脚本其余部分的变量,您需要将它们作为参数传递(就像在我的代码示例中一样)或使用
使用: