Тестирование и отчетность по выполнению Invoke-команды - PullRequest
0 голосов
/ 29 марта 2019

У меня есть следующий скрипт PowerShell, который создает сеанс с учетной записью администратора сервера Windows. Я хочу сообщить об ошибке Invoke-command в случае сбоя и сохранить ее в файл. Ниже приведен код, который я написал, но если я подделываю, например, файл .json (укажите неправильное имя пользователя), выполнение завершится неудачно и error_report.txt не будет создано

#Param(
$user = "lamda"
#)
$user_domain = (Get-WmiObject Win32_ComputerSystem).Domain
$user_computer = (Get-WmiObject Win32_ComputerSystem).Name
$file = "error_report.txt"
If ((Test-Path "creds.json") -eq $True) 
{
$jsonfile = Get-ChildItem creds.json 

if ($jsonfile.Length -eq 0) 
{
   #$file = "error_report.txt"
   Set-Content -Path $file -Value "Error:The file 'creds.json' is empty"
   break

}
else
{
   $creds= (Get-Content creds.json | Out-String | ConvertFrom-Json)
   $admin = $creds.username
   $passwd = $creds.password
   if (($admin) -and ($passwd))
   { 
     $Password = ConvertTo-SecureString -String $passwd -AsPlainText -Force
     $credential = [pscredential]::new($admin,$Password)
     $command = Invoke-Command -ComputerName Server.$user_domain -FilePath 
     C:\SECnology\Data\Utilities\Updating.ps1 -ArgumentList 
     $user,$admin,$user_computer -Credential $credential 
     If ($command -eq $false)
     { 
      $file = "error_report.txt"
      Set-Content -Path $file -Value "Error:Session between user and server 
      could not be created,please check your Credentials"
     }
     break

   }
   elseif (([string]::IsNullOrEmpty($admin)) -or ([string 
   ]::IsNullOrEmpty($passwd))) 
   {
      #$file = "error_report.txt"
      Set-Content -Path $file -Value "Error:One object of 'creds.json' seems 
      to be empty.Please check your file "
   }
}
break
}
else 
{
#$file = "error_report.txt"
Set-Content -Path $file -Value "Error:The file 'creds.json' does not exist"
}

1 Ответ

0 голосов
/ 29 марта 2019

Я думаю, что проблема заключается в том, как вы определяете условие в своем заявлении if. Вы используете -eq $false, однако, если ваши соединения не удаются, он не устанавливает значение command равным $false, оно оставляет команду равной нулю, поскольку не возвращает значения (ошибка). Вы можете попробовать использовать либо пустой оператор (!) В вашем операторе if, так:

If (!$command){Do stuff}

Или вы можете дать команде invoke переменную ошибки и проверить, имеет ли она значение при запуске.

$command = Invoke-Command -ComputerName Server.$user_domain -FilePath 
     C:\SECnology\Data\Utilities\Updating.ps1 -ArgumentList 
     $user,$admin,$user_computer -Credential $credential -ErrorVariable TheError
     If ($TheError)
     {Do stuff}
...