我试图在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发布于 2017-01-14 17:07:37
如果你想比较散列和文件到相同的目录,你可以像这样比较你的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"}
}
}发布于 2017-01-14 21:04:28
或者将散列作为字符串数组直接传递给-Pattern,不要尝试将它们连接起来:
$db2 | select-string -pattern $h_hashed或者,如果您想要提供单个正则表达式模式,可以使用| (正则表达式中的逻辑或)构造它:
$pattern = '(?:{0})' -f ($h_hashed -join '|')
$db2 |Select-String -Pattern $pattern我还建议不要使用Get-Content,直接将Select-String指向文件
Select-String -Path 'C:\users\bob\Desktop\hashes.csv' -Pattern $patternhttps://stackoverflow.com/questions/41646917
复制相似问题