使用ForEach-Powershell在计算机列表中搜索以查找文件中的字符串
我试图在文本文件中的计算机主机文件中查找字符串。我想检查文本文件中的每台机器是否有主机文件中的更改 出于安全目的,我无法放入我正在搜索的实际字符串。我对PowerShell非常陌生,我曾尝试在CMD中执行此操作,但无法获得所需的输出使用ForEach-Powershell在计算机列表中搜索以查找文件中的字符串,powershell,for-loop,powershell-2.0,powershell-3.0,powershell-remoting,Powershell,For Loop,Powershell 2.0,Powershell 3.0,Powershell Remoting,我试图在文本文件中的计算机主机文件中查找字符串。我想检查文本文件中的每台机器是否有主机文件中的更改 出于安全目的,我无法放入我正在搜索的实际字符串。我对PowerShell非常陌生,我曾尝试在CMD中执行此操作,但无法获得所需的输出 $sys = Get-Content .\Systems.txt $Loc = "\\$sys\c$\Windows\System32\Drivers\etc\hosts" $SearchStr = "string" $sel = Select-String -pa
$sys = Get-Content .\Systems.txt
$Loc = "\\$sys\c$\Windows\System32\Drivers\etc\hosts"
$SearchStr = "string"
$sel = Select-String -pattern $SearchStr -path $Loc
ForEach ($System in $sys) {
If ($sel -eq $null)
{
write-host $sys NotFound
}
Else
{
write-host $sys Found
}
}
你离得不远,你只需要重新考虑一下你的ForEach循环。在循环中移动您的
$Loc=
行,使其针对每个系统进行更新,然后跳过$sel=
行,只需将其放入检查中,即可设置:
$sys = Get-Content .\Systems.txt
$SearchStr = "string"
ForEach ($System in $sys) {
$Loc = "\\$system\c`$\Windows\System32\Drivers\etc\hosts"
If (Select-String -pattern $SearchStr -path $Loc -Quiet)
{
write-host "$system Found"
}
Else
{
write-host "$system Not Found"
}
}
我还在c$
的路径中转义了美元符号。我认为在这种情况下不需要这样做,但一般来说,在使用美元符号时,这是一种很好的做法,您希望在这样的字符串中实际使用美元符号。我测试了您所做的更改,但它仍然不能正常工作。我不知道为什么,但我得到一个错误,路径无法连接到。我知道这些机器是在线的,因为我首先对它们进行了ping扫描。这个脚本完全有道理,所以应该没有理由不起作用。它使用搜索字符串“127.0.0.1”对我起作用,并在我试用过的两个系统上找到它。您对您尝试连接的计算机具有管理员权限吗?您通常需要本地管理员权限才能连接到c$管理共享。是的,我们对所有计算机都有管理员权限。奇怪的是。当我在CMD中做同样的事情时,我得到了几乎相同的错误。我使用了'psexec-sh',直到那时我才能找到字符串;我只是没有得到我需要的输出。明天,我将对此进行一些修改,以使用psexec。谢谢你的更新。所以,没有psexec,这一切都能正常工作。问题最终是我的用户错误。