Powershell:如果CSV条目为空,如何引发错误

Powershell:如果CSV条目为空,如何引发错误,csv,powershell,if-statement,try-catch,custom-error-handling,Csv,Powershell,If Statement,Try Catch,Custom Error Handling,我已经编写了一个广泛的脚本,通过广告终止过程运行,该脚本可以从CSV获取必要的信息。如果CSV中的条目为空,如何使其出错?我试着把我知道怎么做的每一件事都放进去。我已经尝试更改错误操作,我可以让它抛出系统生成的错误(例如,“无法将参数“Identity”绑定到目标…”),但我无法让它执行我想要的操作。请参见下面的代码示例: (是的,我知道我在复制值。这在脚本后面的部分很重要,而不是我遇到问题的部分) 我需要它做的是,如果CSV中的任何条目为空,则抛出一个错误,然后终止。我尝试过的最有希望的想法是

我已经编写了一个广泛的脚本,通过广告终止过程运行,该脚本可以从CSV获取必要的信息。如果CSV中的条目为空,如何使其出错?我试着把我知道怎么做的每一件事都放进去。我已经尝试更改错误操作,我可以让它抛出系统生成的错误(例如,“无法将参数“Identity”绑定到目标…”),但我无法让它执行我想要的操作。请参见下面的代码示例:

(是的,我知道我在复制值。这在脚本后面的部分很重要,而不是我遇到问题的部分)

我需要它做的是,如果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 

这不是全部,但这是我们正在处理的部分

考虑以下数据集。请注意其中一列的姓氏为null

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
,但它不起作用,因为
$不是数组,而是具有属性的对象。因此,我使用对象属性
来执行与的比较

Bacon提出了一个有趣的观点,这段代码不会只考虑空格和空值


我们使用
throw
,因此如果遇到空值,处理将停止。使用这个if块,你可以做任何你想做的事情

考虑以下数据集。请注意其中一列的姓氏为null

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
,但它不起作用,因为
$不是数组,而是具有属性的对象。因此,我使用对象属性
来执行与的比较

Bacon提出了一个有趣的观点,这段代码不会只考虑空格和空值


我们使用
throw
,因此如果遇到空值,处理将停止。使用这个if块,你可以做任何你想做的事情

在这里你会遇到很多问题

首先,
$Owner-eq$Null
不会做您可能想做的事情。主要问题是空字符串不是空值。他们是不同的。相反,您的测试应该是:

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

如果字符串仅包含制表符、空格或其他空白字符,或者为空字符串,或者为null,则第二个返回true

其次,要抛出异常,需要使用
throw
关键字。请参阅
获取有关\u Throw的帮助
。例如:

if ([string]::IsNullOrWhiteSpace($owner)) {
    throw "Owner is null or empty.";
}
如果在
try
块中嵌入了此项,则可以用关联的
catch
块捕获异常。请参阅
获取有关\u Try\u Catch\u Finally的帮助
。我相信,您也可以使用
Trap
(请参阅
获取有关\u Trap
的帮助)

最后,遇到错误时的默认操作由
$ErrorActionPreference
变量控制。该变量的默认值为
Continue
,因此将显示错误消息,但脚本将继续执行,就好像根本没有发生错误一样。我不完全确定如何处理手动抛出的异常和try/catch块,但除非我知道我希望我的脚本忽略错误,否则我会从以下内容开始编写每个脚本:

$ErrorActionPreference = Stop;

有关此项的更多信息,请参见
获取有关偏好变量的帮助
获取有关公共参数的帮助

您将在此处遇到许多问题

首先,
$Owner-eq$Null
不会做您可能想做的事情。主要问题是空字符串不是空值。他们是不同的。相反,您的测试应该是:

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

如果字符串仅包含制表符、空格或其他空白字符,或者为空字符串,或者为null,则第二个返回true

其次,要抛出异常,需要使用
throw
关键字。请参阅
获取有关\u Throw的帮助
。例如:

if ([string]::IsNullOrWhiteSpace($owner)) {
    throw "Owner is null or empty.";
}
如果在
try
块中嵌入了此项,则可以用关联的
catch
块捕获异常。请参阅
获取有关\u Try\u Catch\u Finally的帮助
。我相信,您也可以使用
Trap
(请参阅
获取有关\u Trap
的帮助)

最后,遇到错误时的默认操作由
$ErrorActionPreference
变量控制。该变量的默认值为
Continue
,因此将显示错误消息,但脚本将继续执行,就好像根本没有发生错误一样。我不完全确定如何处理手动抛出的异常和try/catch块,但除非我知道我希望我的脚本忽略错误,否则我会从以下内容开始编写每个脚本:

$ErrorActionPreference = Stop;

有关此项的更多信息,请参见
Get Help about_Preference_Variables
Get Help about_CommonParameters

我还想指出,我已经尝试运行if-else,并尝试在不使用脚本其余部分的情况下通过在单独的选项卡中运行该块来捕获语句。这仍然不起作用。我还想指出,我已经尝试运行if-else和try-catch语句,而不使用脚本的其余部分,只在单独的选项卡中运行该块。这个性病