首页 > 解决方案 > powershell:管道获取内容到带有参数的ps1文件

问题描述

我正在尝试编写一个脚本,它使用 powershell cmdlet get-content tail 并将新行插入到 sql server 表中。我无法获得将尾部通过管道传递到处理表插入的 sqlinsert.ps1 文件的语法。

我正在寻找有关如何将“get-content tail”通过管道传输到 sqlinsert.ps1 文件以使用以下命令执行 sql 数据库插入语句的帮助:

$startTime = get-date
Write-Host "\\iisserver\logs\Logs-$("{0:yyyyMMdd}" -f (get-date)).txt"
get-content "\\iisserver\logs\Logs-$("{0:yyyyMMdd}" -f (get-date)).txt" -tail 1 -wait  |  & "sqlinsert.ps1" -stmp $("{0:yyyy-MM-dd hh:mm:ss.fff}" -f (get-date)) -method "Error" -msg $_
# %  { "$_ read at $(Get-Date -Format "hh:mm:ss")" }

在 sqlinsert.ps1 中:

param ([string]$stmp, [string]$method, [string]$msg ) 
$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString = "server='$serverName';database='$databaseName';User ID = $uid; Password = $pwd;"
$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection

$sql = "insert into [tbl_iiserrors] (errstamp, method, msg) values (@stmp , @method, @msg)  " 

. . .

我得到的错误:

& :术语“sqlinsert.ps1”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。在 C:\Temp\ob\iislog\tst_tail.ps1:3 char:95

  • ... Mdd}" -f (get-date)).txt" -tail 1 -wait | &“sqlinsert.ps1”-stmp $ ...
  •                                               ~~~~~~~~~~~~~~~
    
    • CategoryInfo : ObjectNotFound: (sqlinsert.ps1:String) [], CommandNotFoundException
    • 完全限定错误 ID:CommandNotFoundException

建议[3,General]:找不到命令sqlinsert.ps1,但在当前位置确实存在。默认情况下,Windows PowerShell 不会从当前位置加载命令。如果您信任此命令,请键入:“.\sqlinsert.ps1”。有关更多详细信息,请参阅“获取关于_Command_Precedence 的帮助”。

当我从 powershell 命令运行 sqlinsert.ps1 时,它可以工作: PS c:\temp> .\sqlinsert -stmp 2020-11-20 00:00:00 -method 'eek' -msg 'uh hello'

标签: powershell

解决方案


为了将管道输入绑定到参数,您需要用[Parameter]属性装饰它并指定它接受管道输入,如下所示:

param (
  [string]$stmp,
  [string]$method, 
  [Parameter(ValueFromPipeline = $true)]
  [string]$msg
)

有关如何修改参数行为的更多详细信息,请参阅about_Functions_Advanced_Parameters帮助文件


推荐阅读