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, вы можете делать любые действия, которые захотите.