0

我几乎完成了我的剧本,并在深夜进行了一些编辑并重写了我的旧版本,所以我不能回去了。

脚本运行良好,仍然需要一些调整,但现在它已经完全停止了。

这个想法是 GC 一个 IP 列表。解析 IP 并将它们放在 Excel 表中。然后将工作表保存到 htm 和 xlsx。最后把这些邮寄给我。

现在它卡在整理表格,保存和邮寄......有人能给我一些关于我在这里做错了什么的见解吗?

它卡在整理表格、保存和邮寄上。

它不再对 B3:B$Count 进行排序:

使用“1”参数调用“排序”的异常:“排序引用无效。确保它在您要排序的数据内,并且第一个排序依据框不相同或空白。”
在 C:\Folder\Scripts\Get-IP.ps1:137 char:5
+ [void] $objRange.Sort($objRange2)
+ ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation

它不再保存 xlsx 文件,而是保存 HTM 文件。它显然没有覆盖某些东西。我什至重新启动以确保。

使用“1”参数调用“SaveAs”时出现异常:“Microsoft Excel 无法访问文件‘C://Folder/BlockedIP/HTML/2014-07-08/0BCEF810’。工作簿。”
在 C:\Folder\Scripts\Get-IP.ps1:160 char:5
+ $b.SaveAs("$FileXML")
+ ~~~~~~~~~~~~~~~~~~~~~ ~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation

最后,它不再向我发送电子邮件:

新对象:使用“2”参数调用“.ctor”的异常:“指定的字符串不是电子邮件地址所需的格式。”
在 C:\Folder\Scripts\Get-IP.ps1:217 char:13
+ $SMTP = New-Object System.Net.Mail.MailMessage($SMTP, 587)
+ ~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New- Object],MethodInvocationException
+ FullyQualifiedErrorId:ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

剧本:

#Get current date
$Date = get-date -format yyyy-MM-dd

#Define all files/Paths.
$Path = "C:/Folder/BlockedIP"
md "$Path/HTML/$Date" -Force
    $path2 = "$Path/HTML/$Date"
$PathWeb = "/HTML/$Date"

#Define File's used or created in this script.
$File = "$Path/IP-$Date.txt"
    $FileHtml = "$Path2/IP-$Date.htm"
    $FileXML = "$Path2/IP-$Date.xlsx"
    $FileHTMLWeb = "$PathWeb/IP-$date.htm"

#Get content from given IP list.
$colComputers = @(get-content $File | Sort -unique)
   $count = $colComputers.Count
       write-output "$Count IP's detected."

#Define error actions.
#$erroractionpreference = "SilentlyContinue"

#Open Excel.
$a = New-Object -comobject Excel.Application

#Since we want this script to look like it's being used without excel I set it's visibility to false.
$a.visible = $True

#Disable excel confirmations.
$a.DisplayAlerts = $False

#Create sheets in Excel.
$b = $a.Workbooks.Add()
$c = $b.Worksheets.Item(1)

#Create a Title for the first worksheet and adjust the font
$row = 1
$Column = 1
target="_parent">Creator'
$c.Cells.Item($row,$column)= "Blocked IP's $Date"
$c.Cells.Item($row,$column).Font.Size = 18
$c.Cells.Item($row,$column).Font.Bold=$True
$c.Cells.Item($row,$column).Font.Name = "Cambria"
$c.Cells.Item($row,$column).Font.ThemeFont = 1
$c.Cells.Item($row,$column).Font.ThemeColor = 4
$c.Cells.Item($row,$column).Font.ColorIndex = 55
$c.Cells.Item($row,$column).Font.Color = 8210719
$range = $c.Range("a1","e1")
$range.Merge() | Out-Null
$range.VerticalAlignment = -4160

#Define subjects.
$c.Name = "Blocked IP's ($Date)"
$c.Cells.Item(2,1) = "Given IP"
$c.Cells.Item(2,2) = "Resolved DNS"
$c.Cells.Item(2,3) = "Returned IP"
$c.Cells.Item(2,5) = "Company name"

#Define cell formatting from subjects.
$c.Range("A2:E2").Interior.ColorIndex = 6
$c.Range("A2:E2").font.size = 13
$c.Range("A2:E2").Font.ColorIndex = 1
$c.Range("A2:E2").Font.Bold = $True

#Define the usedrange for autofitting.
$d = $c.UsedRange

#Make everything fit in it's cell
$D.EntireColumn.AutoFit() | Out-Null

#Define html code for Excel save to .htm.
$xlExcelHTML = 44

#Define rows to alter in excel.
$iRow = 3
$intRow = 3

#Time to run the script.
foreach ($strComputer in $colComputers)
{
#Place IP's from text in the excel sheet
$c.Cells.Item($intRow, 1) = $strComputer.ToUpper()
$d.EntireColumn.AutoFit() | Out-Null

#Create a status bar for the script
$i = 1
Write-Progress -Activity `
"Creating a usable 'Blocked IP' list ($i/$count)" `
-PercentComplete ($i/$colComputers.Count*100) `
-Status "Please stand by"

try {
    $dnsresult = [System.Net.DNS]::GetHostEntry($strComputer)
    }
    catch {
          $dnsresult = "$null"
          }

#Clear screen on every checked IP to remove the 'True' statement.
#cls

#Do something with $dnsresults.

#Display information about host
#Give hostname Entry in Cell2
$c.Cells.Item($intRow,2) = $dnsresult.HostName

#IP listed in Cell 3
$c.Cells.Item($intRow,3) = $dnsresult.AddressList[0].IpAddressToString

#Make everything fit in it's cell.
$d.EntireColumn.AutoFit() | Out-Null

#Define row for the IP list.
$intRow = $intRow + 1

#Set background color for the IP list.
$d.Range("A$($iRow):E$($intRow)").interior.colorindex = 15

#Sort all IP's on resolved name.
$objWorksheet = $b.Worksheets.Item(1) 
$objRange = $objWorksheet.UsedRange 
$objRange2 = $objworksheet.Range("B3:B($Count)")  
[void] $objRange.Sort($objRange2) 

#Define borders here.
<# Insert script :D #>

#Define Filters here. (Picking out blank DNS and giving those a name)
<# Insert script :D #>

#Define Filters here. (Picking out specific DNS name and give them color code)
<# Insert script :D #>

#Make everything fit in it's cell.
$d.EntireColumn.AutoFit() | Out-Null



#Clear screen on every checked IP to remove the 'True' statement.
#cls
}
#Save the file as .xlsx on every placed IP to ensure the file is not lost due to any reason.
$b.SaveAs("$FileXML")

#Save final result as a .htm file
$b.SaveAs("$FileHTML",$xlExcelHTML)

#Close and quit Excel.
$b.Close()
get-process *Excel* | Stop-Process -force

#Move .txt file to the correct HTML folder.
move-item $file $path2 -Force

#Clear screen, again. (Let's keep things tidy.)
#cls

#Variables for public IP
# I am defining website url in a variable
$url = "http://checkip.dyndns.com" 
# Creating a new .Net Object names a System.Net.Webclient
$webclient = New-Object System.Net.WebClient
# In this new webdownlader object we are telling $webclient to download the
# url $url 
$IpPublic = $webclient.DownloadString($url)
# Just a simple text manuplation to get the ipadress form downloaded URL
# If you want to know what it contain try to see the variable $IpPublic
$IpPublic2 = $IpPublic.ToString()
$ipPublic3 = $IpPublic2.Split(" ")
$ipPublic4 = $ipPublic3[5]
$ipPublic5 = $ipPublic4.replace("</body>","")
$FinalIPAddress = $ipPublic5.replace("</html>","")

#Variables e-mail.
$From = "Blocked IP <##@g##.com>"
$To = "IT Dept <##@##.nl>"
$CC = "Someone <##r@##.nl"
$SMTP = "smtp.gmail.com"
$Subject = "Blocked IPs for $date ($Count Total)"
#The href should point to the htm file in your iis/apache folder.
$WebLink = $FinalIPAddress+$FileHtmlWeb
$here = "<a href='http://$Weblink'><b>Here</b></a>"
#Define the body of your e-mail, in this case it displays a message and shows the server it is send from with it's local IP.
#A link to the .htm file, how many IP's were blocked and the date of the message.
$Body = "This is an automated message generated by server: $env:COMPUTERNAME, $IP</br></br>
Please see the attachment or click $here to get the $Count blocked IP's of $date. </br>    </br></br>"

#Variables e-mail user.
$username = "##@##.com"
$password = "##"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
$ip = (Get-WmiObject -class win32_NetworkAdapterConfiguration -Filter 'ipenabled = "true"').ipaddress[0]

#Clear screen, again. (Let's keep things tidy.)
#cls

#Send output as e-mail.
$SMTP = New-Object System.Net.Mail.MailMessage($SMTP, 587) 
$SMTP.EnableSsl = $true 
$SMTP.Credentials = New-Object System.Net.NetworkCredential("$username", "$password"); 
$SMTP.isbodyhtml= $true
$SMTP.Send($From, $To, $Subject, $FileXML, $Body)

send-mailmessage -BodyAsHtml -from $From -to $To -cc $CC -subject $Subject -Attachments     $FileXML -body $Body -priority High -smtpServer $SMTP -credential ($cred) -usessl


#Create a function to relase Com object at end of script.
function Release-Ref ($ref) { 
    ([System.Runtime.InteropServices.Marshal]::ReleaseComObject( 
    [System.__ComObject]$ref) -gt 0) 
    [System.GC]::Collect() 
    [System.GC]::WaitForPendingFinalizers() 
                            }

#Release COM Object
[System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$a) |     Out-Null

#Clear screen for the final time. (Let's keep things tidy.)
#cls

#Exit powershell 
exit

任何帮助将不胜感激!

4

2 回答 2

1

使用“1”参数调用“排序”的异常:“排序引用无效。确保它在您要排序的数据内,并且第一个排序依据框不相同或空白。”

仔细检查$objRange$objRange2引用正确的范围:

$objRange.Address()
$objRange2.Address()

在没有看到您的实际数据的情况下,我无法在这里告诉您太多其他信息。


使用“1”参数调用“SaveAs”时出现异常:“Microsoft Excel 无法访问文件‘C://Folder/BlockedIP/HTML/2014-07-08/0BCEF810’。工作簿。”

如果路径真的是C://Folder/...你会得到一个不同的例外。请不要编造错误信息。


新对象:使用“2”参数调用“.ctor”的异常:“指定的字符串不是电子邮件地址所需的格式。”

您混淆了MailMessageSmtpClient类。更不用说你甚至不需要它们中的任何一个,因为Send-MailMessage无论如何你都在使用。只需删除以下 5 行:

$SMTP = New-Object System.Net.Mail.MailMessage($SMTP, 587) 
$SMTP.EnableSsl = $true 
$SMTP.Credentials = New-Object System.Net.NetworkCredential("$username", "$password"); 
$SMTP.isbodyhtml= $true
$SMTP.Send($From, $To, $Subject, $FileXML, $Body)
于 2014-07-08T18:12:17.127 回答
0

通过将代码更改为:

$objRange = $c.Range("A$($iRow):E$($intRow)")
$objRange2 = $c.Range("B$($iRow):B$($intRow)")
[void] $objRange.Sort($objRange2) 

原来它卡在 xml 文件的标题上

将邮件替换为:

$From = "Blocked IP <##@##.##>"
$To = "IT Dept <##@##.##>"
$CC = "Someone <##@##.##"
$Subject = "Blocked IPs for $date ($Count Total)"
#The href should point to the htm file in your iis/apache folder.
$WebLink = $FinalIPAddress+$FileHtmlWeb
$here = "<a href='http://$Weblink'><b>Here</b></a>"
#Define the body of your e-mail, in this case it displays a message and shows the server it is send from with it's local IP.
#A link to the .htm file, how many IP's were blocked and the date of the message.
$body = "Dear <font color=black>$to</font>,<br><br>"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
$Username = "##@gmail.com"
$Password = "##"
$message = New-Object System.Net.Mail.MailMessage
$message.IsBodyHTML = $true
$message.ReplyTo = $From
$message.Sender = $From
$message.subject = $subject
$message.body = $body
$message.to.add($to)
$message.from = $username
$message.attachments.add($MailXML)
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$smtp.send($message)

文件的保存原来是一个错误的路径。由于 Excel 工作表是从文件夹 1 创建的,因此它不会直接保存到文件夹 2,因为它的临时保存文件将保留在文件夹 1 中。

于 2014-07-09T17:48:01.237 回答