none
Проверка существования строк \ powershell RRS feed

  • Вопрос

  • Всем добрый день.

    $file = get-content "C:\1.txt"

    $txt = "123","456"

    if ($file -match $txt) {Write-Host "true"} else {write-host "false"}

    Если в файле есть строки:

    123

    456

    то должен вывести true, в обратном соответственно false

    p.s. товарищи (Kazun в частности=) ), объясните дословно смысл строки 

    $file | Where {!($txt -match "$_")}


    • Изменено JabBaton 13 ноября 2012 г. 10:46
    13 ноября 2012 г. 10:25

Ответы

Все ответы

  • 1) Если в файле есть обе строки(т.к. в условии нет,отдельные строки или часть подстроки),будет искать везде(т.е 1234,21235 будут true,т.к. содержат подстроку).

    $file = get-content "C:\1.txt"
    $txt = "123","456"
    $result = $false
    foreach($t in $txt)
    {
    	if($file -match "$t") {
    		$result = $true
    	} 
    	else {
    		$result = $false
    		break
    	}
    }
    $result

    2) $file | Where {!($txt -match "$_")}

    Предположим $file содержит 3 строки (1111,2222,3333),$txt содержит 8,1111,3,2222.Исключим совпадающие строки из $file,которые содержатся в $txt(1111,2222).В этом случае используем оператор сравнения match.

        1) Берем первый элемент из $file (1111)

    • 2) Передаем по конвееру командлету Where
    • 3) $_ становится равным 1111
    • 4) $txt -match "1111" ($txt содержит в себе 1111,поэтому условие верное)
    • 5) !(-not) если условие в пункте 4 вернуло true ,делаем отрицание и !($true) -> false
    • 6) Если условие в пункте 5  true,то значит строка в $_ уникальна и не содержится в переменной $txt,передаем ее дальше(вывод на экран),если false ничего не выводим.
    PS Z:\> $file = 1111,2222,3333
    PS Z:\> $txt =8,1111,3,2222
    PS Z:\> $file | Where {!($txt -match "$_")}
    3333

    13 ноября 2012 г. 11:09
    Отвечающий
  • $sum=0
    $sum1=0
    $content = Get-Content "C:\1.txt"
    foreach ($adr in $txt) 
    {
    if ($file -match $adr ) {$sum1+=1}
    $sum+=1
    }
    
    if ($sum -eq $sum1) {Write-Host "true"} else {write-host "false"}

    Есть предложения как сделать короче? Спасибо
    • Изменено JabBaton 13 ноября 2012 г. 11:23
    13 ноября 2012 г. 11:22
  • $sum=0
    $sum1=0
    $content = Get-Content "C:\1.txt"
    foreach ($adr in $txt) 
    {
    if ($file -match $adr ) {$sum1+=1}
    $sum+=1
    }
    
    if ($sum -eq $sum1) {Write-Host "true"} else {write-host "false"}

    Есть предложения как сделать короче? Спасибо

    Все будет зависеть,сколько элементов будет в $txt.
    13 ноября 2012 г. 11:32
    Отвечающий
  • Kazun, у меня строка будет "10.10.1.1 domain.com #direct"

    Цифры я написал на бум, прости что запутал. Но как я понял в моем случае будет проверяться вся строка, и совпадения наврядли будут!?

    13 ноября 2012 г. 11:33
  • Kazun, у меня строка будет "10.10.1.1 domain.com #direct"

    Цифры я написал на бум, прости что запутал. Но как я понял в моем случае будет проверяться вся строка, и совпадения наврядли будут!?

    Читайте иногда,что пишете,ничего непонятно.


    • Изменено KazunEditor 13 ноября 2012 г. 12:05
    13 ноября 2012 г. 11:43
    Отвечающий
  • НУ вообще это дополнение к тому скрипту с редиректом и правкой filehost.

    ДУмаю 2-3 переменные..не больше. Мне понравилась идея если хоть один false, то break. Думаю поправить! Так будет покороче

    13 ноября 2012 г. 11:44
  • $content = Get-Content "C:\1.txt"
    
    $txt ="10.10.1.1 domain.com #direct","10.9.1.1 domain1.com #direct"
    
    foreach ($adr in $txt)
    
    {
    if ($content -match $adr) {$rez=$true} else {$rez=$false;break}
    }
    if ($rez -eq $true) {Write-Host "true"} else {write-host "false"}

    короче думаю не выйдет...

    13 ноября 2012 г. 11:53
  • Извиняюся еще раз...должен был получше описать суть...
    13 ноября 2012 г. 11:54
  • Для данного примера,можно и короче:

    [io.file]::ReadAllText("C:\1.txt") -match "(?s)(?=.+10.10.1.1 domain.com #direct)(?=.+10.9.1.1 domain1.com #direct)"


    • Изменено KazunEditor 13 ноября 2012 г. 12:19
    13 ноября 2012 г. 12:18
    Отвечающий
  • Нет, так если нужно будет добавить еще один адрес, придется добавлять строчку (?=.+10.9.1.1 domain1.com #direct), а это не то.. Нужна именно переменная с этими строками...
    13 ноября 2012 г. 12:54
  • $file | Where {!($txt -match "$_")}


    Макс, извини, я цель вопроса какая ?
    Если понять как работают регулярные выражения в PowerShell, то у Василия Гусева есть отличная лекция на эту тему:

    http://itband.ru/2010/05/regular-expressions-windows-powershell/


    Andy Mishechkin

    • Помечено в качестве ответа JabBaton 14 ноября 2012 г. 5:29
    13 ноября 2012 г. 15:40
  • Огромное спасибо Andy, не мог найти толкового описания всего этого!
    14 ноября 2012 г. 5:29