2017-01-14 2 views
0

Я пытаюсь использовать переменную в select-string -pattern, но ничего не возвращает. Если я копирую и вставляю содержимое переменной в синтаксис, он работает.Select-String -pattern не принимает переменную

У меня есть несколько хэшей, которые я ранее записывал, и хочу снова получить хэши одного и того же каталога и посмотреть, являются ли они теми же, что были записаны ранее, поэтому я пытаюсь использовать select-string.

Используется для получения исходных хэшей:

$data2hash = "C:\users\blue\Desktop\*.txt" 
$hash = Get-FileHash $data2hash -Algorithm md5 
$h_hash = $hash.hash 


PS C:\Users> get-filehash c:\users\bob\desktop\* -Algorithm md5 | export-csv c:\users\bob\desktop\hashes.csv                 

    Algorithm   Hash                  Path                       
    ---------    ----                  ----                       
    MD5     E081EAAA07EC3CBC71DBC374E85B3031          c:\users\bob\desktop\1.txt                      
    MD5     78D85AB09077BA9BE641C5AFC1EDFEE9          c:\users\bob\desktop\2.txt                                      
    MD5     69B8789ED87248AB5B69C0421ADF6E54          c:\users\bob\desktop\3.txt                                    
    MD5     34DF279CA08B79238246787321939C60          c:\users\bob\desktop\4.txt   

Проверка фазы

$db = 'C:\users\bob\Desktop\hashes.csv' 
    $db2 = Get-Content $db 

    $some_data = "C:\users\bob\Desktop\*" 
    $new_hashes = Get-FileHash $data2hash -Algorithm md5 
    $h_hashes = $hash.hash 

    foreach($h in $h_hash) 
    { 
    $format_hash = "'" + $h + "'," 
    $d += $format_hash 
    } 
    $d = $d.substring(0,$d.length-1) 



    PS C:\Users\bob\desktop> $d.GetType() 
    IsPublic IsSerial Name          BaseType                             
    -------- -------- ----          --------                             
    True  True  String         System.Object 


    $db2 | select-string -pattern $d 

Желаемый результат:

PS C:\Users> $db2 | select-string -pattern $d 

"MD5","3C535413A18289E8CEEF69ED15479515","C:\users\blue\Desktop\computers.txt" 
"MD5","60E6B4CF0E9A1E99E5861ECE1001DB3D","C:\users\blue\Desktop\filecheck.txt" 
"MD5","BC36FF295E4A68EE9C8E04B1D833E836","C:\users\blue\Desktop\FilesCheck_02-08-14.txt 
+0

'$ D = " 'ASD', "FGH" 'не то же самое, как' $ D = «ASD ',' fgh''. – PetSerAl

+0

YOu сравнивает [system.object] с [system.array]. –

ответ

0

, если вы хотите сравнить хэш и файл в той же директории, вы можете сравните ваши файлы csv, как это

#Get-FileHash "c:\temp\*.txt" -Algorithm md5 | export-csv "c:\temp\LastAnalyse.csv" -NoTypeInformation 
Get-FileHash "c:\temp\*.txt" -Algorithm md5 | export-csv "c:\temp\NewAnalyse.csv" -NoTypeInformation 

$LastAnalyse=import-csv "c:\temp\LastAnalyse.csv" 
$NewAnalyse=import-csv "c:\temp\NewAnalyse.csv" 

Compare-Object $LastAnalyse $NewAnalyse -Property Hash, Path 

если вы хотите выглядеть все отличия:

Get-FileHash "c:\temp\*.txt" -Algorithm md5 | export-csv "c:\temp\NewAnalyse.csv" -NoTypeInformation 

$LastAnalyse=import-csv "c:\temp\LastAnalyse.csv" 
$NewAnalyse=import-csv "c:\temp\NewAnalyse.csv" 

$lst=Compare-Object $LastAnalyse $NewAnalyse -Property Hash, Path 

$lst | %{ 
$element=$_ 
$ListSameElement=$lst | where { $_.Path -eq $element.Path -and $_.Hash -ne $element.Hash} | select -First 1 

if ($_.SideIndicator -eq '=>') 
{ 
    if ($ListSameElement.Count -eq 0) 
    { 
    $Explain="New File Created" 
    $OldHash="" 
    } 
    else 
    { 
    $Explain="Hash Modified" 
    $OldHash=$ListSameElement.Hash 
    } 

[pscustomobject]@{Hash=$element.hash;File=$element.Path;OldHAsh=$OldHash; Explain=$Explain} 

} 

elseif ($_.SideIndicator -eq '<=' -and $ListSameElement.Count -eq 0) 
{ 
    [pscustomobject]@{Hash="";File=$element.Path;OldHAsh=$element.hash; Explain="File Deleted"} 
} 

} 
+0

Я старался держаться подальше от объекта сравнения, но так, как вы это делали, он выглядит хорошо. Спасибо, это делает то, что мне нужно. –

0

Либо пройти хэш как строковый массив непосредственно -Pattern, не пытайтесь их конкатенации:

$db2 | select-string -pattern $h_hashed 

или, если вы хотите создать один шаблон регулярного выражения, построить его с помощью | (логический или в регулярном выражении):

$pattern = '(?:{0})' -f ($h_hashed -join '|') 
$db2 |Select-String -Pattern $pattern 

Я также рекомендовал бы указывать Select-String непосредственно в файл, не используйте Get-Content:

Select-String -Path 'C:\users\bob\Desktop\hashes.csv' -Pattern $pattern 
Смежные вопросы