PowerShell:Start-Job -scriptblock 多行脚本块?
PowerShell: Start-Job -scriptblock Multi line scriptblocks?
希望有人能帮我弄清楚这是否可行。我有 20 多行在 while 循环中扫描日志文件。我需要这与脚本的其余部分并行发生。日志扫描循环正在将条目传递到 SQLite 中,其他脚本需要根据此信息进行操作 - 因此希望 运行 它们并行。
如果我使用 Job-Start 命令,那么 -SciptBlock 函数似乎只接受一个管道命令行。我有太多的命令想要通过管道传输,所以我需要在脚本块中 运行 多行。
我尝试了几种方法,但以下示例给出的错误最少。我还在 Invoke-Command -ScriptBlock -as job 中尝试过它,就像在第二个示例中一样 - 两种方式都不接受多行脚本块。
请问我做错了什么?
Start-Job -Name LogScan -ScriptBlock
{
$EventOld = ConvertFrom-Json (Get-content ( Get-ChildItem | Sort-Object -Property LastWriteTime | Select-Object -last 1 ) | Select-Object -last 1)
$RunLoop = 1
while (RunLoop -ge 1)
{
Start-Sleep -Milliseconds 333
$RunLoop = $RunLoop +1
$EventNew = ConvertFrom-Json (Get-content ( Get-ChildItem | Sort-Object -Property LastWriteTime | Select-Object -last 1 ) | Select-Object -last 1)
if ($EventOld.timestamp -ne $EventNew.timestamp)
{
# lots of commands and here passing the array to SQLite
}
$EventOld = $EventNew
}
}
错误如下:
Start-Job : Missing an argument for parameter 'ScriptBlock'.
Specify a parameter of type 'System.Management.Automation.ScriptBlock'
and try again. [..]
感谢 briantist 帮助我到达那里:)
使用Start-Job
和Invoke-Command
时,注意将-ScriptBlock参数的开头{
与命令放在同一行。不要像使用 if
或 while
命令那样将其放在下面的行中。
这导致了一个进一步的问题,即没有发现您没有正确匹配打开 {
和关闭 }
括号,因为您习惯于匹配它们的缩进级别以配对他们起来。
请注意代码中对 $Event.timestamp
的引用。这些来自这样一个事实,即 JSON 字段之一被称为 timestamp
- 它不是标准字符串或数组的方法或 属性。
希望有人能帮我弄清楚这是否可行。我有 20 多行在 while 循环中扫描日志文件。我需要这与脚本的其余部分并行发生。日志扫描循环正在将条目传递到 SQLite 中,其他脚本需要根据此信息进行操作 - 因此希望 运行 它们并行。
如果我使用 Job-Start 命令,那么 -SciptBlock 函数似乎只接受一个管道命令行。我有太多的命令想要通过管道传输,所以我需要在脚本块中 运行 多行。
我尝试了几种方法,但以下示例给出的错误最少。我还在 Invoke-Command -ScriptBlock -as job 中尝试过它,就像在第二个示例中一样 - 两种方式都不接受多行脚本块。
请问我做错了什么?
Start-Job -Name LogScan -ScriptBlock
{
$EventOld = ConvertFrom-Json (Get-content ( Get-ChildItem | Sort-Object -Property LastWriteTime | Select-Object -last 1 ) | Select-Object -last 1)
$RunLoop = 1
while (RunLoop -ge 1)
{
Start-Sleep -Milliseconds 333
$RunLoop = $RunLoop +1
$EventNew = ConvertFrom-Json (Get-content ( Get-ChildItem | Sort-Object -Property LastWriteTime | Select-Object -last 1 ) | Select-Object -last 1)
if ($EventOld.timestamp -ne $EventNew.timestamp)
{
# lots of commands and here passing the array to SQLite
}
$EventOld = $EventNew
}
}
错误如下:
Start-Job : Missing an argument for parameter 'ScriptBlock'.
Specify a parameter of type 'System.Management.Automation.ScriptBlock'
and try again. [..]
感谢 briantist 帮助我到达那里:)
使用Start-Job
和Invoke-Command
时,注意将-ScriptBlock参数的开头{
与命令放在同一行。不要像使用 if
或 while
命令那样将其放在下面的行中。
这导致了一个进一步的问题,即没有发现您没有正确匹配打开 {
和关闭 }
括号,因为您习惯于匹配它们的缩进级别以配对他们起来。
请注意代码中对 $Event.timestamp
的引用。这些来自这样一个事实,即 JSON 字段之一被称为 timestamp
- 它不是标准字符串或数组的方法或 属性。