【问题标题】:Powershell check if variable in CSV filePowershell检查CSV文件中的变量
【发布时间】:2019-11-22 10:59:15
【问题描述】:

我有一个 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)中的下一个元素?

【问题讨论】:

    标签: powershell csv compare string-comparison


    【解决方案1】:

    按要求回答问题:

    如果$AppName 的值等于$Application 数组中的值

    使用以下任一测试:

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

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


    基于your own answer,你真正需要的不是相等比较,而是通配符匹配

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

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

    请注意,它的工作方式略有不同,因为带有数组值 LHS 的 -like 不会返回 Boolean,而是充当 数组过滤器;也就是说,它返回一个匹配元素的数组;如果没有匹配,你会得到一个 empty 数组。

    感谢 PowerShell 的 implicit to-Boolean conversion,然而,返回的数组可以被视为布尔值,因此如果没有匹配项(空数组),则条件实际上是 $false,如果至少有一个元素匹配(非- 具有非空字符串的空数组)。


    PowerShell 的包含操作符,-in-contains

    PowerShell 提供两个(集合)containment operators

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

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

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

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

    【讨论】:

      【解决方案2】:

      使用@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."}
      }
      

      【讨论】:

      • 这有点令人费解。您可以使用switch ($Application) -Wildcard { $Appswitch { ... } },但请注意,在您的情况下,只需使用if ($Application -like $Appswitch) { ... } 就足够了。
      猜你喜欢
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多