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。
我有一个 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
中(匹配其中的一个元素)- 有关详细信息,请参阅底部部分。
基于
您 可以 使用 -like
运算符 ,因为 - 与许多 PowerShell 比较运算符一样,它可以对 数组(集合):
if ($Application -like "$AppName*") { ... }
请注意,它的工作方式略有不同,因为 -like
具有数组值 LHS 不会 return 一个 Boolean , 但充当 array filter;也就是说,它 return 是一个 匹配元素数组 ;如果没有匹配项,您将得到一个 empty 数组。
感谢 PowerShell 的 $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。