将现有的powershell脚本包装为函数?

时间:2014-08-12 14:17:26

标签: function object powershell powershell-v3.0

我有一个这样的脚本:

 [CmdletBinding()]
 param(
    [Parameter(Mandatory=$true)]
    $Message
 )
 Write-Host "Hello, $Message!"

但我想提供一种允许用户点源脚本的方法。最初,我只是想将整个脚本包装在一个函数中以允许点源:

 function Hello
 {
    [CmdletBinding()]
    param(
       [Parameter(Mandatory=$true)]
       $Message
    )
    Write-Host "Hello, $Message!"
 }

这个问题是,如果我这样做,它会破坏一些以旧方式使用它的人的脚本。是否可以返回一个与脚本具有相同功能的对象,或者是否可以按原样点源脚本(上面的第一个例子)?

2 个答案:

答案 0 :(得分:3)

我建议使用[{1}}:

进行拼接
$PSBoundParameters

或者:代替点源,只需从现有脚本创建函数:

[CmdletBinding()]
 param(
    [Parameter(Mandatory=$true)]
    $Message
 )

 function Hello
 {
    [CmdletBinding()]
    param(
       [Parameter(Mandatory=$true)]
       $Message
    )
    Write-Host "Hello, $Message!"
 }

 Hello @PSBoundParameters

答案 1 :(得分:0)

function Hello结束时,您必须触发它以模拟旧行为。因此,如果脚本用于从命令行获取参数,请说c:\scripts\hello.ps1 bob,您可以这样做:

function Hello
{
   ...
}
if($args.Count -eq 0){
   Hello $null
}
else{
   Hello $args
}
如果您在没有参数的情况下运行$args,而不是之前没有传递任何值的c:\scripts\newhello.ps1,那么

$null将是一个空数组。因此,我们在使用正确的参数触发函数之前检查$args.Count