Chr*_*ton 4 email validation powershell
我正在尝试让Powershell使用Regex验证电子邮件地址,并将电子邮件地址放入好的和坏的csv文件中.我可以让它跳过一行并写入文件,但无法让它定位电子邮件地址并验证它们,然后将行写入好的和坏的文件.我可以在C#和JavaScript中完成它,但从未在Powershell中完成它.我知道这可以做到,但不知道如何做.
这是我到目前为止:
Function IsValidEmail {
Param ([string] $In)
# Returns true if In is in valid e-mail format.
[system.Text.RegularExpressions.Regex]::IsMatch($In,
"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|
(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
## Now we need to check the original file for invalid and valid emails.**
$list = Get-Content C:\Emails\OriginalEmails\emailAddresses.csv
# This way we also use the foreach loop.
##======= Test to see if the file exists ===========
if (!(Test-Path "C:\Emails\ValidEmails\ValidEmails.csv")) {
New-Item -path C:\Emails\ValidEmails -name ValidEmails.csv -type
"file" # -value "my new text"
Write-Host "Created new file and text content added"
}
else {
## Add-Content -path C:\Share\sample.txt -value "new text content"
Write-Host "File already exists and new text content added"
}
if (!(Test-Path "C:\Emails\InValidEmails\InValidEmails.csv")) {
New-Item -path C:\Emails\InValidEmails -name InValidEmails.csv -type
"file" # -value "my new text"
Write-Host "Created new file and text content added"
}
else {
# Add-Content -path C:\Emails\ValidEmails -value "new text content"
Write-Host "File already exists and new text content added"
}
#$Addresses = Import-Csv "C:\Data\Addresses.csv" -Header
Name, Address, PhoneNumber | Select -Skip 1
$EmailAddressImp = Import-Csv
"C:\Emails\OriginalEmails\emailAddresses.csv" -Header
FirstName, LastName, Email, Address, City, State, ZipCode | Select
FirstName, LastName, Email, Address, City, State, ZipCode -Skip 1
Run Code Online (Sandbox Code Playgroud)
ForEach ($emailAddress in $list) {
if (IsValidEmail($emailAddress)) {
"Valid: {0}" -f $emailAddress
Out-File -Append C:\Emails\ValidEmails\ValidEmails.csv -Encoding UTF8
$EmailAddressImp | Export-Csv "C:\Emails\ValidEmails\ValidEmails.csv"
-NoTypeInformation
}
else {
"Invalid: {0}" -f $emailAddress
Out-File -Append C:\Emails\InValidEmails\InValidEmails.csv -
Encoding UTF8
$EmailAddressImp | Export-Csv
"C:\Emails\InValidEmails\InValidEmails.csv" -NoTypeInformation
}
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*sen 10
我正在尝试让Powershell使用Regex验证电子邮件地址
我建议不要这样做.使用正则表达式准确验证电子邮件地址可能比您想象的要困难得多.
让我们来看看你的正则表达式模式:
^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$
Run Code Online (Sandbox Code Playgroud)
在它的当前形式中它错误地验证.@domain.tld.
另一方面,它不验证unicode编码的国际化域名,例如user@?.com(是的,这是一个有效的电子邮件地址)
我不会尝试查找或构建完美的电子邮件验证正则表达式模式,而是使用MailAddress该类进行验证:
function IsValidEmail {
param([string]$EmailAddress)
try {
$null = [mailaddress]$EmailAddress
return $true
}
catch {
return $false
}
}
Run Code Online (Sandbox Code Playgroud)
如果输入字符串是有效的电子邮件地址,则转换为[mailaddress]成功且函数返回$true- 如果不是,则转换将导致异常,并返回$false.
导出数据时,我会考虑在内存中一次收集所有结果,然后在结束时将其写入文件一次.
如果您使用的是PowerShell版本2或3,则可以执行相同的两次传递Where-Object:
$EmailAddresses = Import-Csv "C:\Emails\OriginalEmails\emailAddresses.csv" -Header FirstName, LastName, Email, Address, City, State, ZipCode | Select -Skip 1
$valid = $list |Where-Object {IsValidEmail $_.Email}
$invalid = $list |Where-Object {-not(IsValidEmail $_.Email)}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是PowerShell 4.0或更高版本,我建议您.Where()在Split模式下使用扩展方法:
$EmailAddresses = Import-Csv "C:\Emails\OriginalEmails\emailAddresses.csv" -Header FirstName, LastName, Email, Address, City, State, ZipCode | Select -Skip 1
$valid,$invalid = $list.Where({IsValidEmail $_.Email}, 'Split')
Run Code Online (Sandbox Code Playgroud)
在导出到文件之前:
if($valid.Count -gt 0){
$valid |Export-Csv "C:\Emails\ValidEmails\ValidEmails.csv" -NoTypeInformation
}
if($invalid.Count -gt 0){
$invalid |Export-Csv "C:\Emails\ValidEmails\InvalidEmails.csv" -NoTypeInformation
}
Run Code Online (Sandbox Code Playgroud)
您可以只使用-match运算符,而不必调用[Regex]类。这是一个简单的示例,没有任何包装函数:
$EmailRegex = '^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$'
$EmailList = @('a@a.com', 'b@b.co', 'm.a@example.il')
foreach ($Email in $EmailList) {
$DidItMatch = $Email -match $EmailRegex
if ($DidItMatch) {
# It matched! Do something.
}
else {
# It didn't match
}
}
Run Code Online (Sandbox Code Playgroud)
仅供参考,当您使用-match运算符时,如果它返回boolean $true,那么PowerShell会自动填充一个名为的内置(也称为“自动”)变量$matches。为了避免意外行为,您可能希望$null在每次迭代期间将此变量重置为,或者像在原始示例中一样将其包装在函数中。只要您不在父作用域之一中声明变量,这将使变量的作用域保持在函数级别。
验证电子邮件地址后,可以使用以下方法将其附加到现有CSV文件中:
Export-Csv -Append -FilePath filepath.csv -InputObject $Email
Run Code Online (Sandbox Code Playgroud)
为了提高可用文件系统资源的效率,您可能需要先在内存中缓冲一些电子邮件地址,然后再将它们添加到目标CSV文件中。
# Initialize a couple array buffers
$ValidEmails = @()
$InvalidEmails = @()
if ($ValidEmails.Count -gt 50) {
# Run the CSV export here
}
if ($Invalid.Count -gt $50) {
# Run the CSV export here
}
Run Code Online (Sandbox Code Playgroud)
如果您需要进一步的帮助,能否请您编辑问题并弄清什么不适合您?
目前最重要的两个答案都有一个重大缺陷:
@Trevor 的答案会很好,直到你提供它:
John Doe <johndoe@somewhere.com>
Run Code Online (Sandbox Code Playgroud)
@Mathias 的回答鼓吹要适应特殊(但有效)的地址,例如那些带有非 ASCII 或没有 TLD 后缀的地址。以下地址均已通过[mailaddress]强制转换成功验证:
olly@somewhere | olly@somewhere. | olly@somewhere...com etc
Run Code Online (Sandbox Code Playgroud)
如果像我一样,您不会将这些边缘情况纳入您的电子邮件数据库中,那么这两种想法的组合可能会更有用,如下所示:
function IsValidEmail {
param([string]$Email)
$Regex = '^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$'
try {
$obj = [mailaddress]$Email
if($obj.Address -match $Regex){
return $True
}
return $False
}
catch {
return $False
}
}
Run Code Online (Sandbox Code Playgroud)
$obj为可能很长的邮件列表上的每个电子邮件地址创建可能会产生性能开销。但我想那是另一回事了。
| 归档时间: |
|
| 查看次数: |
6631 次 |
| 最近记录: |