Powershell: как вызвать ошибку, если запись CSV пуста

Я написал обширный скрипт, который проходит через процесс завершения AD, и этот скрипт может получить необходимую информацию из CSV. Как мне сделать так, чтобы он выдавал ошибку, если запись в CSV пуста? Я пытался вставить в Try-Catch, If-Else все, что я умею делать. Я попытался изменить действие ошибки, и я могу заставить его генерировать системные ошибки (например, "Невозможно привязать параметр"Identity"к цели..."), но я не могу заставить его делать то, что я хочу. Пожалуйста, посмотрите пример кода ниже:

(Да, я знаю, что дублирую значения. Это важно позже в сценарии, а не в той части, с которой у меня возникают проблемы)

    $owner = $user.'Network User ID'}
    $loginID = $user.'Network User ID'
    $Identity = Get-ADUser -Identity $owner -Properties Displayname |Select-Object -ExpandProperty Displayname 
    $manager = $user.'Provide Inbox Access To'
    $NewOwner = $user.'Provide users email group ownership to'
    $NewOwnerID = $User.'Provide users email group ownership To'

Что мне нужно сделать, это выдать ошибку, если ЛЮБАЯ запись в CSV пуста, и завершиться. Самая многообещающая идея, которую я попробовал, была:

    If ($Owner -eq $Null)
    {
    Write-Host "Invalid entry, the Network User ID field cannot be blank"
    Write-Host "Press Enter to Exit..."
    Exit
    }
    Else
    {
    #Do everything else
    }

Но даже это по-прежнему не удается.

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

Любая помощь очень ценится!

РЕДАКТИРОВАТЬ

Если это поможет, вот больше реального кода...

$Confirmation = Read-Host "Please double check the information in the file. Are you sure you want to continue? (Y/N)"

If($Confirmation -eq "Y")
{
Write-Host "You have chosen to proceed. Processing Termination" -BackgroundColor DarkCyan
#Import file
$file = "C:\TerminateUsers.csv"
$data = Import-Csv $file
#Set disabled OU
$disabledOU = "OU=Users,OU=Disabled Accounts, OU=Corporate"

$colOutput = @()
foreach ($user in $data)
{
    #Grab variables from CSV
    $owner = $user.'Terminated Network User ID'}
    $loginID = $user.'Terminated Network User ID'

    #Displayname required for Outlook functions
    $Identity = Get-ADUser -Identity $owner -Properties Displayname |Select-Object -ExpandProperty Displayname 
    $manager = $user.'Provide Inbox Access To'
    $NewOwner = $user.'Provide users email group ownership to'
    $NewOwnerID = $User.'Provide users email group ownership To'
    If (Get-ADUser -LDAPFilter "(sAMAccountName=$loginID)")
        {
        $date = Get-Date -Format d
        #Disable account, change description, disable dialin, remove group memberships
        Set-ADUser -Identity $loginID -Enabled $false
        Set-ADUser -Identity $loginID -Replace @{Description = "Terminated $date"}
        Set-ADUser -Identity $loginID -Replace @{msNPAllowDialin = $False}
        RemoveMemberships $loginID 

Это еще не все, но это та часть, с которой мы работаем...

2 ответа

Решение

Здесь вы столкнетесь с рядом проблем.

Первый, $Owner -eq $Null не собирается делать то, что вы, вероятно, хотите сделать. В основном проблема в том, что пустая строка не является нулевым значением. Они разные. Вместо этого ваш тест должен быть:

if ([string]::IsNullOrEmpty($owner)) { ... }

Или же:

if ([string]::IsNullOrWhiteSpace($owner)) { ... }

Этот второй возвращает true, если строка содержит только символы табуляции, пробелы или другие пробельные символы, или является пустой строкой, или имеет значение null.

Во-вторых, для исключения необходимо использовать throw ключевое слово. Увидеть Get-Help about_Throw, Например:

if ([string]::IsNullOrWhiteSpace($owner)) {
    throw "Owner is null or empty.";
}

Если у вас есть это встроено в try блок, вы можете поймать исключение со связанным catch блоки. Увидеть Get-Help about_Try_Catch_Finally, Вы также можете использовать TrapЯ верю (см. Get-Help about_Trap).

Наконец, действие по умолчанию при обнаружении ошибки контролируется $ErrorActionPreference переменная. Значение этой переменной по умолчанию Continue, поэтому будут отображаться сообщения об ошибках, но сценарий будет продолжать выполняться так, как если бы ошибок не было вообще. Я не совсем уверен, как это работает с вручную генерируемыми исключениями и блоками try/catch, но если я не знаю, что мой скрипт должен игнорировать ошибки, я начинаю почти каждый скрипт с:

$ErrorActionPreference = Stop;

Увидеть Get-Help about_Preference_Variables а также Get-Help about_CommonParameters для больше об этом.

Рассмотрим следующий набор данных. Обратите внимание на нуль для Last_Name для одного из столбцов.

user_name  first_name last_name
---------  ---------- ---------
lrivera0   Lawrence   Rivera   
tlawrence1 Theresa    Lawrence 
rboyd2     Roy                 
cperry3    Christine  Perry    
jmartin4   Jessica    Martin  

Так что если мы хотим быть уверены, что обрабатывать только полные строки, то простой If покроет это.

Import-Csv .\text.csv | ForEach-Object{
  If($_.Psobject.Properties.Value -contains ""){
     # There is a null here somewhere
     Throw "Null encountered. Stopping"
  } else {
    # process as normal
  }
}

Проблема в том, что Import-CSV рассматривает нули как строки нулевой длины. Я пытался с помощью -contains только $_ но это не сработало $_ это не массив, а объект со свойствами. Поэтому я использовал свойства объекта value выполнить сравнение с.

Бэкон поднял интересный момент в том, что этот код не будет учитывать только пустые значения.

Мы используем throw поэтому обработка останавливается, если встречается ноль. Используя этот блок if, вы можете делать любые действия, которые захотите.

Другие вопросы по тегам