如何编写多个对象链接方法调用以继续跨多行代码?
How do I code multiple object chained method calls to continue across multiple lines of code?
我遇到过很多关于如何跨多行继续 powershell 脚本代码的示例,例如,使用 "back tick" (`):
调用一个传递多个参数的方法
myMethod $arg1 `
$arg2 `
$arg3 `
...etc.
但我想做的是继续跨多行链接对象方法链,例如,我想跨多行代码将其分解:
$ps = [PowerShell]::Create()
[ref]$e = New-Object System.Management.Automation.Runspaces.PSSnapInException
$ps.Runspace.RunspaceConfiguration.AddPSSnapIn( "SqlServerCmdletSnapin100", $e ) | Out-Null
# This is ridiculous; how to I break the below code across multiple lines???
$ps.AddCommand( "Invoke-Sqlcmd").AddParameter( "InputFile", $PreCompareInfoObject.PreCompareBatchScript).AddParameter("serverinstance", $DBConnectInfoObject.DBDestServer).AddParameter("database", $DBConnectInfoObject.DBDestDB).AddParameter( "username", $DBConnectInfoObject.DBDestUserName).AddParameter("password", $DBConnectInfoObject.DBDestPassword).AddParameter( "variable", $variable).AddParameter("outputsqlerrors", $true).AddParameter("abortonerror").AddParameter("Verbose") | out-file -filepath $PreCompareInfoObject.PreCompareOutputReport
$ps.Invoke()
我可以这样做,但我不想这样做,而且出于某种原因,输出比我想要的更冗长:
...
$ps.AddCommand( "Invoke-Sqlcmd")
$ps.AddParameter( "InputFile", $PreCompareInfoObject.PreCompareBatchScript)
$ps.AddParameter("serverinstance", $DBConnectInfoObject.DBDestServer)
$ps.AddParameter("database", $DBConnectInfoObject.DBDestDB)
$ps.AddParameter( "username", $DBConnectInfoObject.DBDestUserName)
$ps.AddParameter("password", $DBConnectInfoObject.DBDestPassword)
$ps.AddParameter( "variable", $variable)
$ps.AddParameter("outputsqlerrors", $true)
$ps.AddParameter("abortonerror")
$ps.AddParameter("Verbose") | out-file -filepath $PreCompareInfoObject.PreCompareOutputReport
...
我想我正在寻找这个,但是当然,它不起作用:
$ps `
.AddCommand( "Invoke-Sqlcmd") `
.AddParameter( "InputFile", $PreCompareInfoObject.PreCompareBatchScript) `
.AddParameter("serverinstance", $DBConnectInfoObject.DBDestServer) `
.AddParameter("database", $DBConnectInfoObject.DBDestDB) `
.AddParameter( "username", $DBConnectInfoObject.DBDestUserName)
如有任何帮助,我们将不胜感激!
这样写:
$ps.
Addcommand("Invoke-SqlCmd").
AddParameter("InputFile", $PreCompareInfoObject.PreCompareBatchScript).
等等
即以点号结束该行,然后您可以继续下一行,无需使用反引号。
您可以将所有或大部分参数存储在哈希表中,然后调用 GetEnumerator()
到 return key/value 对的列表,以及 运行 ForEach-Object
将它们全部添加到您的 $ps
,如果您愿意的话。这会是什么样子。
$params = @{InputFile=$PreCompareInfoObject.PreCompareBatchScript
"serverinstance"=$DBConnectInfoObject.DBDestServer
"database"= $DBConnectInfoObject.DBDestDB
"username"= $DBConnectInfoObject.DBDestUserName
"password"= $DBConnectInfoObject.DBDestPassword
"variable"= $variable
"outputsqlerrors"= $true
}
$params.GetEnumerator() | ForEach-Object {
$ps.AddParameter($_.Key,$_.Value)
}
我仍然会 运行 您的 AddCommand() 单独一行,但您应该使用这种方法处理大部分或所有参数。
我遇到过很多关于如何跨多行继续 powershell 脚本代码的示例,例如,使用 "back tick" (`):
调用一个传递多个参数的方法myMethod $arg1 `
$arg2 `
$arg3 `
...etc.
但我想做的是继续跨多行链接对象方法链,例如,我想跨多行代码将其分解:
$ps = [PowerShell]::Create()
[ref]$e = New-Object System.Management.Automation.Runspaces.PSSnapInException
$ps.Runspace.RunspaceConfiguration.AddPSSnapIn( "SqlServerCmdletSnapin100", $e ) | Out-Null
# This is ridiculous; how to I break the below code across multiple lines???
$ps.AddCommand( "Invoke-Sqlcmd").AddParameter( "InputFile", $PreCompareInfoObject.PreCompareBatchScript).AddParameter("serverinstance", $DBConnectInfoObject.DBDestServer).AddParameter("database", $DBConnectInfoObject.DBDestDB).AddParameter( "username", $DBConnectInfoObject.DBDestUserName).AddParameter("password", $DBConnectInfoObject.DBDestPassword).AddParameter( "variable", $variable).AddParameter("outputsqlerrors", $true).AddParameter("abortonerror").AddParameter("Verbose") | out-file -filepath $PreCompareInfoObject.PreCompareOutputReport
$ps.Invoke()
我可以这样做,但我不想这样做,而且出于某种原因,输出比我想要的更冗长:
...
$ps.AddCommand( "Invoke-Sqlcmd")
$ps.AddParameter( "InputFile", $PreCompareInfoObject.PreCompareBatchScript)
$ps.AddParameter("serverinstance", $DBConnectInfoObject.DBDestServer)
$ps.AddParameter("database", $DBConnectInfoObject.DBDestDB)
$ps.AddParameter( "username", $DBConnectInfoObject.DBDestUserName)
$ps.AddParameter("password", $DBConnectInfoObject.DBDestPassword)
$ps.AddParameter( "variable", $variable)
$ps.AddParameter("outputsqlerrors", $true)
$ps.AddParameter("abortonerror")
$ps.AddParameter("Verbose") | out-file -filepath $PreCompareInfoObject.PreCompareOutputReport
...
我想我正在寻找这个,但是当然,它不起作用:
$ps `
.AddCommand( "Invoke-Sqlcmd") `
.AddParameter( "InputFile", $PreCompareInfoObject.PreCompareBatchScript) `
.AddParameter("serverinstance", $DBConnectInfoObject.DBDestServer) `
.AddParameter("database", $DBConnectInfoObject.DBDestDB) `
.AddParameter( "username", $DBConnectInfoObject.DBDestUserName)
如有任何帮助,我们将不胜感激!
这样写:
$ps.
Addcommand("Invoke-SqlCmd").
AddParameter("InputFile", $PreCompareInfoObject.PreCompareBatchScript).
等等
即以点号结束该行,然后您可以继续下一行,无需使用反引号。
您可以将所有或大部分参数存储在哈希表中,然后调用 GetEnumerator()
到 return key/value 对的列表,以及 运行 ForEach-Object
将它们全部添加到您的 $ps
,如果您愿意的话。这会是什么样子。
$params = @{InputFile=$PreCompareInfoObject.PreCompareBatchScript
"serverinstance"=$DBConnectInfoObject.DBDestServer
"database"= $DBConnectInfoObject.DBDestDB
"username"= $DBConnectInfoObject.DBDestUserName
"password"= $DBConnectInfoObject.DBDestPassword
"variable"= $variable
"outputsqlerrors"= $true
}
$params.GetEnumerator() | ForEach-Object {
$ps.AddParameter($_.Key,$_.Value)
}
我仍然会 运行 您的 AddCommand() 单独一行,但您应该使用这种方法处理大部分或所有参数。