1

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

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

$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 пуста.

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

EDIT

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

$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 

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

+0

Я также хотел бы отметить, что я попытался просто запустить инструкции if-else и try-catch без остальной части скрипта, просто запустив этот блок на отдельной вкладке. Это все еще не работает. – Nick

ответ

3

Существует ряд проблем, с которыми вы столкнетесь.

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

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

Или:

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

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

Во-вторых, для исключения исключения вам необходимо использовать ключевое слово 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, поэтому будут отображаться сообщения об ошибках, но сценарий будет продолжать выполняться, как если бы ошибка вообще не возникала. Я не совсем уверен, как это работает с вручную выброшенными исключениями и попробовать/поймать блоки, но если я не знаю, что я хочу, чтобы мой сценарий игнорировать ошибки, я начинаю почти каждый сценарий с:

$ErrorActionPreference = Stop; 

См Get-Help about_Preference_Variables и Get-Help about_CommonParameters для получения более подробной информации об этом.

+0

Возможно, я понял этот вопрос неправильно, но он спросил: «Что мне нужно, чтобы это сделать, это выбросить ошибку, если ЛЮБАЯ запись в CSV пуста и завершение_. Это будет работать, только если вы проверите каждый столбец отдельно, не так ли? – Matt

+0

@Matt Хм, я согласен, но я предполагаю, что я интерпретировал сценарий по-разному. Я предположил, что перед фрагментом был «foreach» ($ user в $ myCsvFile) {... '. –

+0

Я добавил больше блока кода, с которым я работаю, надеясь, что это поможет вам лучше понять, что я делаю. Спасибо! – Nick

2

Рассмотрите следующий набор данных. Обратите внимание на значение null для 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, поэтому обработка прекращается, если встречается нуль. Используя этот блок, вы можете делать все, что хотите.

+1

'Импорт-CSV. \ Text.csv | % {$ _ .psobject.Properties |? {$ _. Name -eq 'values'} | Выбрать -expand значение |? {$ _ -match "^ \ s * $"} |% {Throw "Найденное событие. "; Exit}}' - проверяет каждое значение каждого свойства каждой записи для нулевого или пробельного символа, и, если они найдены, выбрасывает вашу ошибку и завершает работу. – TheMadTechnician

Смежные вопросы