Вывод Get-контента как переменной? - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь запустить цикл foreach для get-content и convertfrom-json cmd. Теперь я знаю, что это может иметь проблемы, связанные с несколькими значениями результатов в переменной, мне интересно, как я могу продолжать передавать эту информацию остальной части сценария.

$testconv = Get-device * |select ID
$testid = $testconv.id

$conv = foreach ($id in $testid) 
{
get-content "\\HDC-PRTG-03\System Information Database\Services\Device$id.Services" | Convertfrom-json 
} 

$rpccheck =$conv.message
$snmpcheck = $conv.message
$svcname = $conv.data.displayname
$svcstate=$conv.data.properties.state

if($RPCon = $rpccheck |select-string -pattern RPC -AllMatches){
write-host RPC Not enabled
}else{
write-host No RPC Enabled - Moving to Services List 

Теперь, когда я запускаю это без $ conv =, превращая его в переменную, он возвращает

kind         : Services 
recievetime  : 29-01-2018 14:43:32
error        : 106
Message      : SNMP Channels Not Available. 

Что я и ожидаю. Тем не менее, когда я определяю переменную с $ conv =, он просто начинает говорить, что не может найти пути к файлам, которые я нахожу странной ошибкой, но эй хо.

У кого-нибудь из вас, умных парней, есть какие-либо указания на то, как я могу сохранить эти объекты из памяти в памяти, чтобы я мог продолжать выполнять циклы foreach против них. Основная функция этого сценария - запросить в локальном файле .services сведения о том, какие службы запущены на устройстве, а затем создать датчики для их мониторинга в рамках нашей установки PRTG. Поэтому мне нужно иметь возможность изменить ID устройства и применить к нему вещи.

Я подозреваю, что я могу использовать слишком много циклов foreach во всем сценарии, но, честно говоря, я на 100% из моей глубины

Любое руководство чрезвычайно ценится

Сэм

1 Ответ

0 голосов
/ 04 июля 2018

Если я правильно понимаю, у вас должны быть файлы json для всех идентификаторов устройств. Если файл с именем определенного устройства отсутствует, вы получите сообщение об ошибке «Файл не найден».

Что касается кода, вы можете попробовать это:

$testconv = Get-Device * | select ID
$testid = $testconv.id

$oldErrorAction = $ErrorActionPreference
$ErrorActionPreference = 'Stop'

foreach ($id in $testid) {
    try {
        $conv = Get-Content -Path "\\HDC-PRTG-03\System Information Database\Services\Device$id.Services" -Raw | ConvertFrom-Json 
        $rpccheck  = $conv.message  # These look the same to me...
        $snmpcheck = $conv.message  # These look the same to me...
        $svcname   = $conv.data.displayname
        $svcstate  = $conv.data.properties.state

        $Matches = ($rpccheck | Select-String -Pattern "RPC*" -AllMatches)
        if ($Matches.Matches.Count) {
            Write-Host "RPC Not enabled"
        }
        else {
            Write-Host "No RPC Enabled - Moving to Services List "
        }
    }
    catch {
        Write-Warning $_.Exception.Message
    }
} 

$ErrorActionPreference = $oldErrorAction

Вместо try {} .. catch {} вы также можете сначала проверить наличие файла с таким именем, используя Test-Path, непосредственно перед выполнением Get-Content.

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