Поиск подстроки в строке с косой чертой в скриптах Powershell - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь найти подстроку в строке, используя скрипт powershell.На самом деле, я читаю файл построчно, который содержит тысячи путей.Я фильтрую каждый путь из файла.Фильтры пути находят подстроку в пути.Но функция Contains возвращает false, когда подстрока имеет значение Sroot или TRoot.

Ниже приведен пример кода.

foreach($line in Get-Content $filePath)
{
    # Line can contain
    # $line = $/Patil/TEMP/PRoot/Digvijay/Patil/1.png 
    # $line = $/Patil/TEMP/SRoot/Digvijay/Patil/2.png
    # $line = $/Patil/TEMP/TRoot/Digvijay/Patil/3.png
    if($line)
    {        
        if($line.Contains('RRoot')) # This condition works properly
        {                       
            # Process Rroot here
        }                       
        if($line.Contains('SRoot')) # This condition fails.
        {
            # Process SRoot here
        }
        if($line.Contains('TRoot')) # This condition fails.
        {
            # Process TRoot here
        }
    }
 }

Входной файл имеет вид:

$/Patil/TEMP/PRoot/Digvijay/Patil/1.png
$/Patil/TEMP/SRoot/Digvijay/Patil/2.png
$/Patil/TEMP/TRoot/Digvijay/Patil/3.png
$/Patil/TEMP/WRoot/Digvijay/Patil/3.png

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вместо использования нескольких IF

  • вы можете использовать переключатель, управляемый буквой перед Root, определяемой
  • a RegEX, хранящим совпавший символ в группе захвата() вызывается через $Matches[1]:

$filePath = '.\files.txt'
Get-Content $filePath | Where-Object {$_ -match '([PST])Root'} | ForEach-Object {
    $line = $_
    switch ($Matches[1]){
        'P' {'{0}={1}' -f $_,$line} # code in {} to execute on P
        'S' {'{0}={1}' -f $_,$line} # code in {} to execute on S
        'T' {'{0}={1}' -f $_,$line} # code in {} to execute on T
    }
}

Пример вывода:

P=P:/TEMP/PRoot/Digvijay/Patil/1.png
S=S:/TEMP/SRoot/Digvijay/Patil/2.png
T=T:/TEMP/TRoot/Digvijay/Patil/3.png

PS: оператор -match иоператор switch по умолчанию нечувствителен к регистру,
, чтобы изменить это поведение, используйте -cmatch соотв.Переключатель с параметром -CaseSensitive.

0 голосов
/ 14 февраля 2019

Используйте оператор без учета регистра -ilike

foreach($line in Get-Content $filePath)
{
    # Line can contain
    # $line = P:/TEMP/PRoot/Digvijay/Patil/1.png
    # $line = S:/TEMP/SRoot/Digvijay/Patil/2.png
    # $line = T:/TEMP/TRoot/Digvijay/Patil/3.png
    if($line)
    {        
        if($line -ilike "*RRoot*")) # This condition works properly
        {                       
            # Process Rroot here
        }                       
        if($line -ilike "*SRoot*")) # This condition fails.
        {
            # Process SRoot here
        }
        if($line -ilike "*TRoot*")) # This condition fails.
        {
            # Process TRoot here
        }
    }
 }
0 голосов
/ 14 февраля 2019

Я попробовал ваш код, и он работает как положено (изменил $line.Contains('RRoot') на $line.Contains('PRoot'), чтобы соответствовать примеру ввода).

Я думаю, что вы, возможно, боретесь с чувствительной к регистру проблемой.Я предлагаю вам попробовать применить функцию tolower() к строке, а затем сравнить со строкой в ​​нижнем регистре:

foreach($line in Get-Content $filePath)
{
    # Line can contain
    # $line = P:/TEMP/PRoot/Digvijay/Patil/1.png
    # $line = S:/TEMP/SRoot/Digvijay/Patil/2.png
    # $line = T:/TEMP/TRoot/Digvijay/Patil/3.png
    if($line)
    {
        $lineLower=$line.tolower()
        if($lineLower.Contains('proot')) # This condition works properly
        {                       
            Write-Host "PRoot"
        }                       
        if($lineLower.Contains('sroot')) # This condition fails.
        {
            Write-Host "SRoot"
        }
        if($lineLower.Contains('troot')) # This condition fails.
        {
            Write-Host "TRoot"
        }
    }
 }
...