Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell检查CSV文件中是否存在变量_Powershell_Csv_Compare_String Comparison - Fatal编程技术网

Powershell检查CSV文件中是否存在变量

Powershell检查CSV文件中是否存在变量,powershell,csv,compare,string-comparison,Powershell,Csv,Compare,String Comparison,我有一个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.ful

我有一个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
数组中的值,则执行
推送位置
并执行
winrar
命令。如果没有,请跳到
foreach($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."}
}

回答所问问题:

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

使用以下任一测试:

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


基于,您实际需要的不是相等比较,而是通配符匹配

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

请注意,这与使用数组值LHS的
-like
略有不同,它不返回布尔值,而是充当数组过滤器;也就是说,它返回匹配元素的数组;如果没有匹配项,则得到一个空数组

但是,由于PowerShell,返回的数组可以像布尔值一样处理,因此如果没有匹配的元素(空数组),则条件有效地为
$false
,如果至少有一个匹配的元素(非空数组和非空字符串),则条件有效地为
$true


PowerShell的安全壳运算符,
-in
-contains
: PowerShell提供两个(系列):

  • -in
    (否定也存在:
    -notin
  • -contains
    (否定也存在:
    -notcontains
两者基本上都对
的每个元素执行
-eq
测试,并返回布尔值(
$true
$false
),以指示集合中是否(至少)有一个元素与潜在成员匹配

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


有关这些运算符的更多信息,请参阅。

这有点复杂。您可以使用
switch($Application)-Wildcard{$Appswitch{…}
,但请注意,在您的情况下,只需使用
if($Application-like$Appswitch){…}
就足够了。
if ($Application -like "$AppName*") { ... }