Powershell 检查 CSV 文件中的变量

Powershell check if variable in CSV file

我有一个 PS 脚本,它循环遍历文件夹并归档其中的一些:

$CSV = import-csv -path C:\folder\Builds\ApplicationsMappingNew.csv
$Application = $CSV.Application

$GetAppPath = Get-ChildItem -Path $DestinationDir\Server\*

foreach($line in $GetAppPath){

        $AppPath = $Line.fullname
        $AppName = Split-Path $AppPath -Leaf
        $RAR_Destination = "C:\folder\Builds\test1\SOA-ConfigurationManagement"+"\"+"$AppName"+"_st-FTP.rar"
        Push-Location $AppPath
        & "C:\Program Files (x86)\WinRAR\rar" a -r $RAR_Destination 
}

我有一个 CSV 文件,其中有一个应用程序列:

我的问题是 - 在 foreach 循环内,如何比较 $Appname 循环变量值与 $Application 数组变量内的值?

并且,如果$AppName的值等于$Application数组中的值,则执行Push-Location并执行winrar命令。如果不是,跳到 foreach($line in $GetAppPath)?

中的下一个元素

使用@mklement0 提示,我已经组装了以下解决方案:

$CSV = import-csv -path C:\test\ApplicationsMappingNew.csv
$Application = $CSV.Application
$GetAppPath = Get-ChildItem -Path $DestinationDir\Server\*

foreach($line in $GetAppPath){

    $AppPath = $Line.fullname
    $AppName = Split-Path $AppPath -Leaf
    $Appswitch = "$AppName"+"*"
    $RAR_Destination = "C:\folder\Builds\test1\SOA-ConfigurationManagement"+"\"+"$AppName"+"_st-FTP.rar"
    switch ($Appswitch) {$Application -like $_} { 
        Push-Location $AppPath
        &"C:\Program Files (x86)\WinRAR\rar" a -r $RAR_Destination 
        } 
        default {Write-Host "Application $AppName is not in csv file."}
}

回答问题:

if the value of $AppName equals a value inside the $Application array

使用以下任一测试:

if ($AppName -in $Application) { ... 
if ($Application -contains $AppName) { ... 

以上执行文字、整值、不区分大小写的匹配,以查看 $AppName 是否包含在数组 $Application 中(匹配其中的一个元素)- 有关详细信息,请参阅底部部分。


基于,其实你需要的不是equality比较,而是wildcard匹配.

可以 使用 -like 运算符 ,因为 - 与许多 PowerShell 比较运算符一样,它可以对 数组(集合):

if ($Application -like "$AppName*") { ... }

请注意,它的工作方式略有不同,因为 -like 具有数组值 LHS 不会 return 一个 Boolean , 但充当 array filter;也就是说,它 return 是一个 匹配元素数组 ;如果没有匹配项,您将得到一个 empty 数组。

感谢 PowerShell 的 ,但是,returned 数组可以像布尔值一样处理,因此条件实际上是 $false 如果没有匹配项(空数组),并且$true 如果至少有一个元素匹配(具有非空字符串的非空数组)。


PowerShell 的包含运算符,-in-contains:

PowerShell 提供两个(合集)containment operators:

  • <potential-member> -in <collection>(否定也存在:-notin
  • <collection> -contains <potential-member>(否定也存在:-notcontains

两者本质上都对 <collection> 和 return 的每个元素执行 -eq 测试 <potential-member> 布尔值($true$false ) 以指示集合中的(至少)一个元素是否与潜在成员匹配。

对于字符串,与 -eq 一样,每个元素都使用文字、整值、不区分大小写的匹配针对潜在成员进行测试。

有关这些运算符的详细信息,请参阅 this answer