通过字符串变量传递PowerShell Get-ChildItem筛选器参数不起作用 [英] Passing Powershell Get-ChildItem filter parameter through a string variable is not working

查看:9
本文介绍了通过字符串变量传递PowerShell Get-ChildItem筛选器参数不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的脚本中,我有下面的函数,它以"*.csproj"、"*.vbproj"、"*.sln"的形式返回一个字符串。假设我总是将"csproj,vbproj,sln"这样的字符串传递给$Filter参数:

Function Create-Filter($filter)
{    
    $str = $filter.Split(',') | ForEach-Object {"""*.$($_.Trim())"""}

    $str = $str -join ', '
    [string]$str
    return
}

稍后在我的脚本中,我执行:

$filter = Create-Filter($filter)
$myFiles = Get-ChildItem $source -Include $filter -Recurse  
但是$myFiles为空,Get-ChildItem没有返回任何内容。我知道问题出在传递给Get-ChildItem时的$Filter参数中,但我不知道如何解决这个问题。

无论如何,从PowerShell控制台,如果我在下面这样做,它可以工作:

PS > $filter = "*.csproj", "*.vbproj", "*.sln"
PS > Get-ChildItem "D:PathToMyRootFolder" -Include $filter -Recurse

那么我做错了什么?

我的PowerShell版本如下图所示:

更新(解决方案): AdminOfThings提出的解决方案奏效。 在我的例子中,应用AdminOfThings不起作用,因为我在代码中犯了一个错误。我将CREATE-FILTER函数返回的值赋给作为参数传递的同一个变量,如下所示:

$filter = Create-Filter ($filter)
Get-ChildItem "D:PathToMyRootFolder" -Include $filter -Recurse

为了让它正常工作,我做了以下工作:

$formattedfilter = Create-Filter ($filter)
Get-ChildItem "D:PathToMyRootFolder" -Include $formattedfilter -Recurse

...也就是说,使用不同的变量按函数赋值,而不是使用与我作为参数传递的变量相同的变量。

推荐答案

简而言之,您需要从函数中删除文字引号(将三重双引号替换为单双引号)、-Join和字符串转换([string])。基本上,所有影响输出的内容都需要删除。

Function Create-Filter($filter)
{    
    $filter.Split(',') | ForEach-Object {"*.$($_.Trim())"}
    return
}

-Include参数接受单个字符串或字符串数组。当您传递-Include "string1","string2"时,您正在将一个字符串数组传递给命令。在您的筛选器中,您正在创建一个包含文字引号和逗号的字符串。这里的微妙之处在于,在引号中包含逗号将创建一个包含引号的字符串,而之间的引号将创建一个逗号分隔的字符串列表。因此,该命令实际上是读取-Include '"string1","string2"',它将什么也找不到。即使您的函数输出的文本看起来与您直接在命令中键入的文本相同,PowerShell也会以不同的方式解释这些值。

您可以在下面看到PowerShell将函数的输出解释为单字符串的行为。

create-filter ("txt","csv")
"*.txt", "*.csv"
(create-filter ("txt","csv")).gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

下面的数组语法(逗号分隔的字符串类型列表)输出不同的结果。

"*.txt","*.csv"
*.txt
*.csv
("*.txt","*.csv").gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

执行代码:

$str = "txt,csv"
create-filter $str
*.txt
*.csv
$filter = create-filter $str
Get-ChildItem . -Include $filter -Recurse
    Directory: C:	emp	est1


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/8/2019  10:47 AM             68 -44.csv
-a----         6/8/2019  10:47 AM            101 -54.csv
-a----        6/11/2019   8:50 AM            229 count.txt
-a----        6/11/2019   8:58 AM            170 destination.txt
-a----        6/11/2019   8:53 AM            302 f.txt
-a----        6/12/2019   6:36 AM            294 hashash.txt
-a----         6/6/2019   1:14 PM              4 jaf.csv
-a----         6/6/2019   1:31 PM              0 job1.txt

这篇关于通过字符串变量传递PowerShell Get-ChildItem筛选器参数不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆