为PowerShell动态创建参数参数';让我们去拿儿童用品

为PowerShell动态创建参数参数';让我们去拿儿童用品,powershell,get-childitem,Powershell,Get Childitem,长话短说,我试图在PowerShell的获取ChildItem中动态使用参数-Directory或-File。你猜怎么着?我不能 交易如下(注意:伪代码): $Using:mode是它抛出错误的地方,或者: PS C:\Users\janreilink> v:\test.ps1 vevida-optimizer file look for: 'vevida-optimizer' A positional parameter cannot be found that accepts argu

长话短说,我试图在PowerShell的
获取ChildItem
中动态使用参数
-Directory
-File
。你猜怎么着?我不能

交易如下(注意:伪代码):

$Using:mode
是它抛出错误的地方,或者:

PS C:\Users\janreilink> v:\test.ps1 vevida-optimizer file
look for: 'vevida-optimizer'
A positional parameter cannot be found that accepts argument '-File'.
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : webserver-01.example.net

整个下午我都在读关于动态参数集的书,但我还不能完全理解它。任何要点都非常(非常、非常)受欢迎。

您将希望使用它来代替。首先创建一个哈希表,其中包含一些或所有要传递的参数:

$dynamicArgs = @{}

if( $type -eq "file" ) {
    $dynamicArgs['File'] = $true
}
elseif( $type -eq "directory" ) {
    $dynamicArgs['Directory'] = $true
}
然后,在
Invoke命令
中,在变量名前面加上
@
前缀,表示要“splat”参数:

Get-ChildItem -Path "z:\www" -Depth 5 @Using:dynamicArgs -Filter $Using:filter -Recurse

如果splatting表包含值为
$true
的键
文件
,则相当于在命令行上添加
-File:$true
,反之亦然,对于
目录
参数

,另一种方法可能是从字符串创建scriptblock<代码>$scriptBlock=[scriptBlock]::创建($string)这正是我需要的,谢谢。标记为答案的答案。
$dynamicArgs = @{}

if( $type -eq "file" ) {
    $dynamicArgs['File'] = $true
}
elseif( $type -eq "directory" ) {
    $dynamicArgs['Directory'] = $true
}
Get-ChildItem -Path "z:\www" -Depth 5 @Using:dynamicArgs -Filter $Using:filter -Recurse