【问题标题】:Passing arguments to a function [duplicate]将参数传递给函数[重复]
【发布时间】:2022-01-26 23:47:52
【问题描述】:

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

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 不希望将参数参数作为逗号分隔的列表。将呼叫从 $result = createVssSnapshot("C:\", "C:\vssSnapshot", $false) 更改为 $result = createVssSnapshot "C:\" "C:\vssSnapshot" -openSnapshotAfter:$false
  • 简而言之:必须调用 PowerShell 函数、cmdlet、脚本和外部程序-foo('arg1', 'arg2')。如果您使用, 分隔参数,您将构造一个命令将其视为单个参数数组。请参阅this answer 了解更多信息。

标签: function powershell arguments visual-sourcesafe


【解决方案1】:

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

传递所示参数的正确方法是:

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

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

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

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

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

    [switch]$OpenSnapshotAfter
  )

  # ...
}

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2015-11-10
    • 2015-06-06
    • 2013-07-09
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多