【问题标题】:Inject custom steps in a PowerShell script在 PowerShell 脚本中注入自定义步骤
【发布时间】:2015-12-08 21:39:58
【问题描述】:

假设我有以下 PS 脚本 myscript.ps1:

param(
  [string]$ID
)

Write-Host "Step 1 $ID"
Write-Host "Step 2 $ID"
# Inject some custom step here
Write-Host "Step 3 $ID"

我从另一个 PS 脚本调用

$ [path]\myscript.ps1 -ID 001
$ [path]\myscript.ps1 -ID 002
$ [path]\myscript.ps1 -ID 003

现在当我运行最后一个电话时:

$ [path]\myscript.ps1 -ID 003

我想在之后触发一些自定义行为/步骤:

Write-Host "Step 2 $ID"

在 myscript.ps1 中。我考虑过这个:

$ [path]\myscript.ps1 -ID 001
$ [path]\myscript.ps1 -ID 002
$ [path]\myscript.ps1 -ID 003 -customScript "[path]\custom.ps1"

然后将 myscript.ps1 更新为:

param(
  [string]$ID,
  [string]$custom=""
)

Write-Host "Step 1 $ID"
Write-Host "Step 2 $ID"
if($custom) {
    & $custom
}
# Inject some custom step here
Write-Host "Step 3 $ID"

也许有一些更优雅的方式来做到这一点?

我看过: http://blogs.msdn.com/b/powershell/archive/2008/06/11/powershell-eventing-quickstart.aspx

但它似乎并不真正符合目的。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以传递自定义ScriptBlock 并执行它:

    param(
      [string]$ID,
      [scriptblock]$custom
    )
    
    Write-Host "Step 1 $ID"
    Write-Host "Step 2 $ID"
    
    # Inject some custom step here
    if($custom){. $custom}
    
    Write-Host "Step 3 $ID"
    

    例子:

    $ [path]\myscript.ps1 -ID 001
    $ [path]\myscript.ps1 -ID 002
    $ [path]\myscript.ps1 -ID 003 -custom {Write-Host "I'm a custom scriptblock!"}
    

    更多关于执行脚本块:

    【讨论】:

    • 不过,这是否比将路径传递给自定义脚本文件更优雅尚有争议。
    • @AnsgarWiechers Scriptblock 可以运行自定义 scipt,因此它在 IMO 中的用途更加广泛。
    • 自定义脚本也可以运行自定义脚本块。这两种方法在功能上是等效的。
    • @AnsgarWiechers 脚本块比文件更容易动态构建。为您节省一个中间步骤和磁盘 I/O。当然,这取决于要执行的代码量——在某个阈值之后创建一个完整的脚本更可取。但对于简短的 sn-ps,我会使用脚本块。
    猜你喜欢
    • 2023-02-06
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2012-09-24
    相关资源
    最近更新 更多