将参数传递给函数

Passing arguments to a function

我发现这个 link 用于在 Windows 下创建 vss 卷影副本。但是代码使用固定字符串作为参数:

function createVssSnapshot{
[cmdletbinding()]
param(
    [string]$targetVolume="C:\",
    [string]$accessPath='C:\vssSnapshot',
    [bool]$openSnapshotAfter=$true
)
[..]

我想修改它以使其更灵活:

function [String]createVssSnapshot{
[cmdletbinding()]
param(
    [String]$targetVolume,
    [String]$accessPath,
    [Bool]$openSnapshotAfter
)
[..]

并使用

调用它
$result = createVssSnapshot("C:\", "C:\vssSnapshot", $false)

但我收到以下错误:

createVssSnapshot : Die Argumenttransformation für den Parameter "targetVolume" kann nicht verarbeitet werden. Der Wert kann nicht in den Typ "System.String" konvertiert werden.
In F:\Powershell_4_Pure\Object_based.ps1:143 Zeichen:28
+ $result = createVssSnapshot("C:\", "C:\vssSnapshot", $false)
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidData: (:) [createVssSnapshot], ParameterBindingArgumentTransformationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,createVssSnapshot

抱歉出现德语错误消息,但 targetVolume 似乎不是 System.String 类型。

我在这里错过了什么?

对于以后的问题:如何修改 PowerShell ISE 以显示英文错误消息?

在 PowerShell 中,参数参数通过 nameposition 传递给命令,但单独参数的参数是 NOT 以逗号分隔(与许多类 C 语言不同)。

传递参数的正确方法是:

$result = createVssSnapshot "C:\" "C:\vssSnapshot" -openSnapshotAfter:$false

我强烈建议将 $openSnapshotAfter 参数的类型约束更改为 [switch] 而不是 [bool] - 它始终默认为 $false 而你然后可以通过 -openSnapshotAfter 而不是 -openSnapshotAfter:$true.

来指定它

因为您将不再为前 2 个参数提供默认值,我还建议将它们标记为 Mandatory - 这样,如果调用者不这样做,PowerShell 将拒绝尝试执行您的函数' t 传递参数:

function New-VssSnapshot {
  [CmdletBinding()]
  param(
    [Parameter(Mandatory)]
    [string]$TargetVolume,

    [Parameter(Mandatory)]
    [string]$AccessPath,

    [switch]$OpenSnapshotAfter
  )

  # ...
}