将参数传递给函数
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 中,参数参数通过 name 或 position 传递给命令,但单独参数的参数是 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
)
# ...
}
我发现这个 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 中,参数参数通过 name 或 position 传递给命令,但单独参数的参数是 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
)
# ...
}