将参数传递给Powershell函数的“正确”方法是什么

时间:2020-04-11 05:18:13

标签: powershell

有人写过“ VBA编码器的PowerShell技巧”指南吗?我正在尝试自学Powershell,我在VBA中有一些经验。定义参数并将其传递给函数的“正确”方法是什么。

这是我的测试代码:

Function Pass-Parameters1
{param( $s1,  $s2)
write-host Pass-Parameters1 s1: $s1
Write-Host Pass-Parameters1 s2: $s2
return $s1 + $s2
}

Function Pass-Parameters2($ss1, $ss2){
Write-Host Pass-Parameters2 ss1: $ss1
Write-Host Pass-Parameters2 ss2: $ss2
return $ss1 + $ss2
}

$x = "Hello "
$y = "There!!"

$z = Pass-Parameters1 -s1 $x -s2  $y
$zz = Pass-Parameters2 $x, $y
$zzz = Pass-Parameters2 $x $y

Write-Host 1..Z = $z
write-host 1.ZZ = $zz
Write-Host 1ZZZ = $zzz

以下是结果:

Pass-Parameters1 s1: Hello 
Pass-Parameters1 s2: There!!
Pass-Parameters2 ss1: Hello  There!!
Pass-Parameters2 ss2: 
Pass-Parameters2 ss1: Hello 
Pass-Parameters2 ss2: There!!
1..Z = Hello There!!
1.ZZ = Hello  There!! 
1ZZZ = Hello There!!

推荐使用哪种方法(示例1或示例2)?我对Powershell有很多了解,因为$zz = Pass-Parameters2 $x, $y并没有达到我的预期,这就是我在VBA中调用函数的方式。我假设$z = Pass-Parameters1 -s1 $x -s2 $y是调用函数的推荐方法,因为没有歧义。

欢迎任何评论或建议!

4 个答案:

答案 0 :(得分:0)

要为函数指定参数,我会选择2形式,因为对我来说1过于冗长/我习惯于functionname(argument1,argument2)的.net语言/大多数类似C的编程语言都没有函数内部没有用于描述参数的单独行,但这是个人喜好


您可以提供参数名称(以连字符开头),并以任意顺序提供参数:

$z = Pass-Parameters1 -s1 $x -s2 $y
$z = Pass-Parameters1 -s2 $y -s1 $x 

您可以使用空格分隔参数并按顺序提供参数:

$zzz = Pass-Parameters2 $x $y

这两个都是正确的,并且大多数语言都有位置参数和命名参数。使用命名参数方法的好处是,如果您不想指定所有参数。还需要考虑到Power Shell开发人员可以强制某些参数为位置参数,而其他参数则为命名参数,因此有时您需要指定名称

例如,Write-Host可以将一系列事物输出为它的第一个参数,并具有用于将它们分开的参数作为命名参数(如所写的第三个参数)。如果您要传递数组,但根本不指定第二个arg(如所写,它控制换行行为),则需要Write-Host $someArray -separator ":"-它混合了位置和名称,并且由于位置的方式需要显示/ named已由(Microsoft)指定,否则最终将得到更多输出内容,从而只能进行写入

如果要指定所有参数,或仅需要指定5参数函数的前3个,请使用较简洁但易读的格式。如果您习惯于(可怕的)命名字符串变量s1,s2,s3,则调用Add-Person -name $s1 -address $s2 -ssn $s3可以使内容可读。或使用良好的变量名,并使用Add-Person $name $address $ssn,因为当变量在描述数据方面做得很好时,指定参数名更为简洁/冗余。如果您要传递字符串文字,请考虑使用名称:Add-Person "Markus Crescent" "Lee Street" "12345"-这是名称和地址(好吧,这是一个延伸,但请考虑这些字符串是否只是诸如“要保留的文件”和“文件”之类的路径删除”)


这将您的X和Y转换为数组,将其传递给第一个参数,而对第二个则不传递任何内容。然后Write-Host将该行的内容正确打印在一行上:

$zz = Pass-Parameters2 $x, $y

答案 1 :(得分:0)

您的PowerShell代码对于PowerShell用户恕我直言看起来很不寻常。这是一个示例,我将如何格式化您的函数:

function Pass-Parameters1 {
    Param(
        $s1,
        $s2
    )
    Write-Host "Pass-Parameters1 s1: $s1"
    Write-Host "Pass-Parameters1 s2: $s2"
    return $s1 + $s2
}

function Pass-Parameters2($ss1, $ss2) {
    Write-Host "Pass-Parameters2 ss1: $ss1"
    Write-Host "Pass-Parameters2 ss2: $ss2"
    return $ss1 + $ss2
}

两个版本均有效。以我的经验,第一种方法更常见,因为如果您有很多带有类型定义,开关,必需标记,默认值,约束,位置信息或其他附加信息的参数,则它会更清晰。查阅this文档,以了解甚至一个参数的定义可能有多么复杂。

您可能已经习惯于使用其他语言的function Pass-Parameters2($ss1, $ss2)这样的语法,但是由于您将在Pass-Parameters2 -ss1 "String1" -ss2 "String2"这样的PowerShell中调用函数,因此您不会坚持使用其他语言(例如{ {1}}。

答案 2 :(得分:0)

谢谢Caius Jard和Thomas。我发现的重要信息是Pass-Parameters2 $x, $y将$ x和$ y作为数组传递给函数中的第一个变量,而Pass-Parameters2 $x $y传递两个变量。

我需要阅读有关Powershell的其他一些基础教程,以学习语法的要点,而不是在VBA模式下思考。

答案 3 :(得分:0)

您传递给函数的参数将添加到名为“ args”的数组中。此args []数组可按以下方式使用:

    Function TestFunction(){
     # access your arguments in the args array
        Write-Host args[0]
    }

    TestFunction $param1 $param2 $param3

或者您可以显式命名参数:

    Function TestFunction($test1, $test2, $test3){
     # access your arguments in the args array
        Write-Host $test1
    }

TestFunction $param1 $param2 $param3
相关问题