检查csv中是否存在数组中的任何值

时间:2013-10-31 21:46:18

标签: arrays loops powershell csv

我有以下代码段

$dllCheckList = import-csv "c:\path\dllCheckList.csv" 
#dllCheckList.csv contains two items 'test1.dll' , 'test2.dll'

$resultsArray1 = @("test2.dll","test3.dll")
$resultsArray2 = @("test3.dll","test4.dll")
$resultsArray3 = @("test1.dll","test2.dll")

我会使用哪种比较/循环,以便$resultsArray1编写者test2.dll$resultsArray2不写任何内容,$resultsArray3test.dll, test2.dll < / p>

3 个答案:

答案 0 :(得分:3)

我建议使用Compare-Object <array1> <array2> -passthru -excludeDifferent -includeEqual

答案 1 :(得分:0)

执行此操作的一种方法是使用从csv数据中即时构建的正则表达式,然后对每个数组使用-match。这样可以节省迭代csv中每个条目的每个数组。不确定你的csv是什么样的,但是你需要导入它,然后首先构建一个包含所有dll名称的数组,或者修改它以直接使用csv代替数组。

#$dllCheckList = import-csv "c:\path\dllCheckList.csv" 
#dllCheckList.csv contains two items 'test1.dll' , 'test2.dll'

$dll_checklist = @('test1.dll','test2.dll')


$resultsArray1 = @("test2.dll","test3.dll")
$resultsArray2 = @("test3.dll","test4.dll")
$resultsArray3 = @("test1.dll","test2.dll")

[regex] $dll_regex = ‘(?i)^(‘ + (($dll_checklist |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’

$resultsArray1,$resultsArray2,$resultsArray3 |
foreach {$_ -match $dll_regex}

test2.dll
test1.dll
test2.dll

可以在此处找到创建正则表达式的行的说明: http://blogs.technet.com/b/heyscriptingguy/archive/2011/02/18/speed-up-array-comparisons-in-powershell-with-a-runtime-regex.aspx

答案 2 :(得分:0)

假设$resultsArray3的输出应该是test1.dll, test2.dll而不是test.dll, test2.dll,并假设c:\path\dllCheckList.csv是带有标题的实际CSV,我会使用{{ 1}}和-contains运算符:

-join