在PowerShell中,在声明字符串数组参数时,是否可以使用测试路径(或其他内容)验证多个文件

在PowerShell中,在声明字符串数组参数时,是否可以使用测试路径(或其他内容)验证多个文件,powershell,Powershell,我有一个函数,它接受文件的字符串数组参数,我想使用测试路径(或其他方法)来确保字符串数组参数中的所有文件都存在。如果可能的话,我想在参数声明中这样做 这可能吗?您可以使用ValidateScript param( [parameter()] [ValidateScript({Test-Path $_ })] [string[]]$paths ) 有关参数验证的更多文档,请访问,您可以将参数设置为使用如下验证脚本: Function DoStuff-WithFiles{ Param([Param

我有一个函数,它接受文件的字符串数组参数,我想使用测试路径(或其他方法)来确保字符串数组参数中的所有文件都存在。如果可能的话,我想在参数声明中这样做


这可能吗?

您可以使用ValidateScript

param(
[parameter()]
[ValidateScript({Test-Path $_ })]
[string[]]$paths
)

有关参数验证的更多文档,请访问

,您可以将参数设置为使用如下验证脚本:

Function DoStuff-WithFiles{
Param([Parameter(Mandatory=$true,ValueFromPipeline)]
    [ValidateScript({
        If(Test-Path $_){$true}else{Throw "Invalid path given: $_"}
        })]
    [String[]]$FilePath)
Process{
    "Valid path: $FilePath"
}
}
建议不要只是传回$true/$false,因为函数不会给出好的错误消息,请使用Throw,就像我上面所做的那样。然后,您可以将其作为函数或管道字符串调用,它将处理通过验证的,并在throw语句中为未通过验证的抛出错误。例如,我将向函数传递一个有效路径(C:\Temp)和一个无效路径(C:\Nope),您可以看到结果:

@("c:\temp","C:\Nope")|DoStuff-WithFiles
Valid path: c:\temp
DoStuff-WithFiles : Cannot validate argument on parameter 'FilePath'. Invalid path given: C:\Nope
At line:1 char:24
+ @("c:\temp","C:\Nope")|DoStuff-WithFiles
+                        ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (C:\Nope:String) [DoStuff-WithFiles], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,DoStuff-WithFiles

编辑:我部分撤回了抛出评论。显然,当验证现在失败时,它确实会给出描述错误(谢谢Paul!)。我可以发誓它(至少过去是这样)只是给出了一个错误,说明它没有通过验证,并省略了它正在验证的内容和它正在验证的内容。对于更复杂的验证脚本,我仍然会使用Throw,因为脚本的用户可能不知道什么是
$\u-match'((?:25[0-5]| 2[0-4][0-9]|[01]?[0-9][0-9]?)\{3}(?:25[0-5]| 2[0-4][0-9]|[01]|[0-9]|$'。
意味着验证IPv4地址时会出现错误。

测试路径已接受管道输入,因此您只需直接将阵列发送到:

@($path1, $path2) | Test-Path
然后返回:

> @("C:\foo", "C:\Windows") | Test-Path
False
True
如果您只想知道它们是否都存在:

($pathArray | Test-Path) -notcontains $false
这将产生:

 False

-Path
确实接受字符串数组,因此您可以这样做。ValidateScript的默认输出还将包括失败的项,因此只要您只更改throw声明,它现在看起来有点多余?我认为它只会给出一些无用的失败信息。也许自从我第一次了解ValidateScripton我的机器(v4)以来,情况发生了变化。它足够安全了,我只是自己检查了一下。很高兴知道。谢谢你,保罗@技术员大人,你的回答帮助我理解了更多的事实,但保罗的回答对我想做的事情更为严格。