通过字符串变量传递PowerShell Get-ChildItem筛选器参数不起作用 [英] Passing Powershell Get-ChildItem filter parameter through a string variable is not working
本文介绍了通过字符串变量传递PowerShell Get-ChildItem筛选器参数不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
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屋!
查看全文