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上要能够在脚本块中使用脚本其余部分的变量,您需要将它们作为参数传递(就像在我的代码示例中一样)或使用使用:
。