如何在 Get-Content 读取一行时调用函数
How to call a function when Get-Content reads a line
我正在设置一个脚本,每次写入某个日志文件时都会向我发送一封电子邮件,但是当 Get-Content 读取新行时,管道不会调用 sendmail 函数。
sendmail函数定义在下一行之前,成功的给我发了一封邮件。
Get-Content -Tail 0 -Wait app.log | sendmail
您需要了解什么是进程块。它为输入的每个元素运行。将您的代码放在流程块中,它会做您想要的,正如其他人已经回答的那样。进程块在 powershell 中非常重要。
function hi {
process {
'hi'
}
}
Get-Content -Tail 0 -Wait app.log | hi
hi
hi
hi
您应该通过进程块从管道中获取值:
function sendmail {
process {
$secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
Send-MailMessage -SmtpServer mysmtp -Credential $cred -UseSsl -From 'myemail@domain.com' -To 'toemail@domain.com' -Subject 'TEST'
}
}
这将告诉 PowerShell,您希望这部分代码为管道上传递的每个对象(在本例中为每一行)运行。如果要从进程块内部访问当前对象,请使用 $_
作为变量。
我正在设置一个脚本,每次写入某个日志文件时都会向我发送一封电子邮件,但是当 Get-Content 读取新行时,管道不会调用 sendmail 函数。
sendmail函数定义在下一行之前,成功的给我发了一封邮件。
Get-Content -Tail 0 -Wait app.log | sendmail
您需要了解什么是进程块。它为输入的每个元素运行。将您的代码放在流程块中,它会做您想要的,正如其他人已经回答的那样。进程块在 powershell 中非常重要。
function hi {
process {
'hi'
}
}
Get-Content -Tail 0 -Wait app.log | hi
hi
hi
hi
您应该通过进程块从管道中获取值:
function sendmail {
process {
$secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
Send-MailMessage -SmtpServer mysmtp -Credential $cred -UseSsl -From 'myemail@domain.com' -To 'toemail@domain.com' -Subject 'TEST'
}
}
这将告诉 PowerShell,您希望这部分代码为管道上传递的每个对象(在本例中为每一行)运行。如果要从进程块内部访问当前对象,请使用 $_
作为变量。