Просмотр информации об оперативной памяти Powershell на удаленном компьютере и сохранение номеров деталей в другой переменной - PullRequest
0 голосов
/ 29 января 2020

У меня есть простой скрипт, который может получить номера оперативной памяти с удаленного компьютера и выполнить поиск в Google. Но это не работает, как задумано. Если на удаленном компьютере установлен только 1 модуль ОЗУ, он отлично работает, Google открывает результаты поиска по Партнурму, ууу!.

, если на удаленном компьютере установлено более 1 модуля ОЗУ, первый Partnumber в переменной ищется в Google. 2-й, 3-й, 4-й номера партнеров набираются на Chrome вкладке 2,3,4 в качестве адреса.

Как мне получить Chrome для поиска всех номеров партнеров через Google ?

Мой скрипт:

$ComputerName = Read-Host "Write Computer Name"

Get-WmiObject Win32_PhysicalMemory -computername $ComputerName
$ToChrome = Read-Host 'Do you want to search Google for the Partnumber(s)? Y Or N'

if ($ToChrome -eq 'Y') {$Partnumber = Get-WmiObject Win32_PhysicalMemory -computername $ComputerName | select -expandproperty Partnumber
Start-Process "chrome.exe" ("https://www.google.com/search?q=$Partnumber")}
if ($ToChrome -eq 'n') {Continue}

Ответы [ 2 ]

1 голос
/ 29 января 2020

Это потому, что chrome .exe интерпретирует пространство между номерами деталей как новые адреса.

Я позволил себе выполнить сценарий с помощью try & catch, выводом файла журнала и имени компьютера в качестве параметра, так что Вы можете назвать его как Get-MemoryPropertyAndSearchWithGoogle.ps1 -ComputerName ComputerName1

Для тестирования я использовал атрибут DeviceLocator, так как мой PartNumber был пуст.

#Get-MemoryPropertyAndSearchWithGoogle.ps1
Param (
      [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
      [string]$ComputerName
    )
$ErrorPreference='Stop'
$ErrorActionPreference='Stop'
$LogFilePath = "C:\Temp\$((Get-Date).ToString("yyyy-MM-dd"))$($ComputerName)Get-MemoryPropertyAndSearchWithGoogle.log"
[string]$LogFileString = ""
#$Property = "PartNumber"
$Property = "DeviceLocator"
$ErrorExists = $false
$ComputerMemoryObjects = @()
try
  {
    $ComputerMemoryObjects = Get-WmiObject Win32_PhysicalMemory -ComputerName $ComputerName -Property *
    $LogFileString += "$((Get-Date).ToString("yyyy-MM-dd_HH:mm:ss"))#INF#Get-WmiObject Win32_PhysicalMemory -ComputerName $($ComputerName)`n"
  }
catch
  {
    $LogFileString += "$((Get-Date).ToString("yyyy-MM-dd_HH:mm:ss"))#ERR#$($error[0].exception.message)`n"
    $ErrorExists = $true
  }
[string]$SearchString = ""
foreach ($SingleComputerMemoryObject in $ComputerMemoryObjects) 
  {
    if ($SearchString)
      {
        $SearchString += "+OR+"
      }
    $SearchString += "$($SingleComputerMemoryObject.$Property)"
  }
$ToChrome = Read-Host 'Do you want to search Google for the Partnumber(s)? Y Or N'
if ($ToChrome -eq 'Y') 
  {
    if ($SearchString)
      {
        try
          {
            Start-Process "chrome.exe" ("https://www.google.com/search?q=$($SearchString)")
            $LogFileString += "$((Get-Date).ToString("yyyy-MM-dd_HH:mm:ss"))#INF#chrome.exe started with searchstring:`"$($SearchString)`"`n"
          }
        catch
          {
            $LogFileString += "$((Get-Date).ToString("yyyy-MM-dd_HH:mm:ss"))#ERR#$($error[0].exception.message)`n"
            $ErrorExists = $true
          }
      }
    else
      {
        $LogFileString += "$((Get-Date).ToString("yyyy-MM-dd_HH:mm:ss"))#INF#`$SearchString is empty`n"
      }
  }
if (!($ErrorExists))
  {
    $LogFileString += "$((Get-Date).ToString("yyyy-MM-dd_HH:mm:ss"))#INF#ScriptCompletedWithoutErrors`n"
  }
$LogFileString | Out-File $LogFilePath
$LogFileString
0 голосов
/ 29 января 2020

Вы получаете несколько объектов от Get-WmiObject. Вам нужно все oop, если вы хотите что-то сделать для каждого из них.

Кроме того, хорошая вещь - кодирование URL-адресов, которые вы вставляете в URL-адрес. и, возможно, поместить его в двойные кавычки не повредит.

Add-Type -AssemblyName System.Web   # for [System.Web.HttpUtility]::UrlEncode()

$ComputerName = Read-Host "Write Computer Name"

$installed_memory = Get-WmiObject Win32_PhysicalMemory -ComputerName $ComputerName | Select-Object Manufacturer,PartNumber,SerialNumber,DeviceLocator,Capacity
$installed_memory | Format-Table -AutoSize

$ToChrome = Read-Host 'Do you want to search Google for the Partnumber(s)? Y Or N'

if ($ToChrome -eq 'Y') {
    $unique_numbers = $installed_memory.Partnumber.Trim() | Sort-Object -Unique
    foreach ($number in $unique_numbers) {
        $query = [System.Web.HttpUtility]::UrlEncode('"' + $number + '"')        
        Start-Process chrome.exe "https://www.google.com/search?q=$query"
    }
}

Powershell имеет удобную удобную функцию: когда у вас есть массив объектов, вы можете запрашивать вложенные свойства у всех них в one go.

Например, если в $installed_memory имеется 4 Win32_PhysicalMemory объектов, то

$installed_memory.Partnumber.Trim()

дает вам 4 легко обрезанных номера детали за один шаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...