如何编写多个对象链式方法调用以跨多行代码继续?

时间:2016-09-21 13:10:06

标签: powershell powershell-v2.0

我已经遇到了很多关于如何跨多行继续使用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)

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

像这样写:

$ps. 
 Addcommand("Invoke-SqlCmd"). 
 AddParameter("InputFile", $PreCompareInfoObject.PreCompareBatchScript).

也就是说,用点结束这一行,然后你可以继续使用下一行,而不使用反引号。

答案 1 :(得分:0)

您可以将所有或大部分参数存储在哈希表中,然后调用GetEnumerator()返回键/值对列表,然后运行ForEach-Object将它们全部添加到$ps如果你愿意的话。这就是woudl的样子。

$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()步骤,但你应该用这种方法处理大部分或全部参数。