Powershell:如果 CSV 条目为空,如何抛出错误
Powershell: How to throw an error if a CSV entry is blank
我编写了一个运行整个 AD 终止过程的扩展脚本,该脚本可以从 CSV 中获取必要的信息。如果 CSV 中的条目为空,我该怎么做才能出错?我试过放入 Try-Catch、If-Else 以及我知道该怎么做的所有内容。我试过更改错误操作,我可以让它抛出系统生成的错误(例如 "Cannot bind parameter "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
这不是全部,但这是我们正在处理的部分...
考虑以下数据集。请注意其中一列的 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
来执行比较。
Bacon 提出了一个有趣的观点,即这段代码不会只考虑空值的空白。
我们使用 throw
,因此如果遇到 null,处理将停止。使用那个 if 块你可以做任何你想做的动作。
这里有很多问题运行。
首先,$Owner -eq $Null
不会做您可能想做的事情。问题主要在于空字符串不是空值。他们是不同的。相反,您的测试应该是:
if ([string]::IsNullOrEmpty($owner)) { ... }
或:
if ([string]::IsNullOrWhiteSpace($owner)) { ... }
第二个 returns 如果字符串仅包含制表符、空格或其他空白字符,或者是空字符串,或者为 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
。
我编写了一个运行整个 AD 终止过程的扩展脚本,该脚本可以从 CSV 中获取必要的信息。如果 CSV 中的条目为空,我该怎么做才能出错?我试过放入 Try-Catch、If-Else 以及我知道该怎么做的所有内容。我试过更改错误操作,我可以让它抛出系统生成的错误(例如 "Cannot bind parameter "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
这不是全部,但这是我们正在处理的部分...
考虑以下数据集。请注意其中一列的 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
来执行比较。
Bacon 提出了一个有趣的观点,即这段代码不会只考虑空值的空白。
我们使用 throw
,因此如果遇到 null,处理将停止。使用那个 if 块你可以做任何你想做的动作。
这里有很多问题运行。
首先,$Owner -eq $Null
不会做您可能想做的事情。问题主要在于空字符串不是空值。他们是不同的。相反,您的测试应该是:
if ([string]::IsNullOrEmpty($owner)) { ... }
或:
if ([string]::IsNullOrWhiteSpace($owner)) { ... }
第二个 returns 如果字符串仅包含制表符、空格或其他空白字符,或者是空字符串,或者为 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
。