显示将要运行的命令

时间:2018-05-23 20:50:14

标签: powershell

如何显示(预览)将要运行的命令?

现有代码:

$sname = "svr01"
$dname = "prod"    

# Reload all views
foreach ($filename in Get-ChildItem -Path Views -Filter "*.sql")
{
Invoke-Sqlcmd –ServerInstance $sname -Database $dname -InputFile $filename.FullName
}

预期输出:

Invoke-Sqlcmd –ServerInstance svr01 -Database prod -InputFile C:\db\Views\AllParts.sql
Invoke-Sqlcmd –ServerInstance svr01 -Database prod -InputFile C:\db\Views\ActiveParts.sql
Invoke-Sqlcmd –ServerInstance svr01 -Database prod -InputFile C:\db\Views\OpenOrders.sql
Invoke-Sqlcmd –ServerInstance svr01 -Database prod -InputFile C:\db\Views\PastOrders.sql

我习惯在Linux中编写脚本,你可以在行前放echo来输出它。 <{1}}前面的echoWrite-Host都会导致错误。

1 个答案:

答案 0 :(得分:3)

您可以通过引用以下命令使echo(真正Write-Output)或Write-HostWrite-Verbose工作。如果你想避免转义,请使用here-string:

Write-Host @'
Invoke-Sqlcmd –ServerInstance $sname -Database $dname -InputFile $filename.FullName
'@

但更好的是PowerShell中进行更改的命令(但并非总是)支持一个名为-WhatIf的公共参数。

理想情况下,您只需将其添加到您的通话中。

如果该命令支持它,您还可以在命令之前在脚本中的某处设置您的首选项:

$WhatIfPreference = $true

然后它将被继承。如果您运行的命令支持它,您必须自行查找,您可以使用Get-Help进行操作。

修改

检查后,它看起来不像Invoke-SqlCmd(也不是像dbatools中可用的更新的替代品)支持-WhatIf

我实际上会说你应该在自己的脚本中添加支持。

我知道这可能看起来有点多,因为你刚刚开始,但它确实有优势。

首先,脚本的工作方式类似于PowerShell中的命令,这意味着它们也可以定义参数。

我们可以从您的脚本顶部开始,并使用属性[CmdletBinding()]告诉PowerShell您希望能够使用高级功能,例如SupportsShouldProces(这会自动启用-WhatIf您的脚本上的参数,您不需要手动声明它。

然后我们将使用自动变量$PSCmdlet及其方法.ShouldProcess()

[CmdletBinding(SupportsShouldProcess)]
param()

$sname = "svr01"
$dname = "prod"    

# Reload all views
foreach ($filename in Get-ChildItem -Path Views -Filter "*.sql")
{
    if ($PSCmdlet.ShouldProcess("DB $dbname on server $sname", "Executing SQL from file $($filename.FullName)")) {
        Invoke-Sqlcmd –ServerInstance $sname -Database $dname -InputFile $filename.FullName
    }
}

现在你可以这样做:

 .\myScript.ps1 -WhatIf

额外奖励:如果您想让它真实地运行,使用.ShouldProcess()会在您要求时自动-Verbose输出:

.\myScript.ps1 -Verbose

除了使用实际的PowerShell约定之外,对这些有什么好处是它在调用上发生所以你不需要编辑脚本来进行干运行。