我正在尝试在get-content和convertfrom-json cmd上运行foreach循环。现在我意识到这可能会导致变量存在多个值的问题,我想知道如何继续将此信息传递给脚本的其余部分。
update_progress()
现在,当我在没有$ conv =的情况下运行它时,它将返回
$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 =定义一个变量时,它只是开始说它找不到我发现抛出异常错误的文件路径,但是嘿。
你们中的任何一个聪明人都对我如何将这些fromjson对象保留在内存中有任何指示,以便我可以继续对它们运行foreach循环。该脚本的最终功能是查询本地.services文件以了解设备上正在运行哪些服务,然后创建传感器以在我们的PRTG安装中对其进行监视。因此,我需要能够引用deviceID并将其应用于它。
我怀疑我可能在整个脚本中使用了太多的foreach循环,但是坦率地说,我超出了我的深度100%
非常感谢任何指导
山姆
答案 0 :(得分:0)
如果我正确理解,您应该拥有所有设备ID的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
测试是否存在具有该名称的文件。