簡體   English   中英

PowerShell腳本循環-警報已創建的新文件

[英]PowerShell Script Loop - Alert New Files Created

我希望具有PowerShell經驗的人能夠(如果可能)如此好心地建議我們如何循環此腳本。 不幸的是,我們對PowerShell腳本循環還不太熟悉,並正在尋找一些建議,這將是最好的方法/方式。 當在指定的文件夾和/或指定日期開始的文件夾中創建新文件時,我們使用下面的腳本在工作時向員工發送電子郵件警報,該文件包括一個列出該文件的.csv文件,然后將其刪除。 發送警報后,我們無需保留生成的.csv文件。 現在,我們要一遍又一遍地復制和粘貼代碼,並在添加新文件夾時修改其中的一部分。 但是,我們擔心的是,隨着周/月/年的推移,添加文件夾后,該文件最終將是頁面,並且必須添加新文件夾。

理想情況下,我們將對腳本進行的唯一更改將是在網絡驅動器中查找的文件夾路徑,創建時間以及將要到達的收件人。

非常感謝您提供關於實現所有或所有這些最佳方法的最佳建議。

非常感謝你!!!

$arr = @()
$file = "\\DesignatedNetworkDrive\NewFileFinderReport.csv"
$mesg = "Please see the attached file for a list of files that were created after July 1, 2016."


# Folder: Corporateshare

gci \\DesignatedNetworkDrive\,\\DesignatedNetworkDrive\Corporateshare\  | Where-Object { $_.CreationTime -ge "07/02/2016" } | % {
  $obj = New-Object PSObject
  $obj | Add-Member NoteProperty FullName $_.FullName
  $obj | Add-Member NoteProperty Length $_.Length
  $obj | Add-Member NoteProperty Owner ((Get-ACL $_.FullName).Owner)
  $obj | Add-Member NoteProperty LastAccessTime $_.LastAccessTime
  $obj | Add-Member NoteProperty LastWriteTime $_.LastWriteTime
  $obj | Add-Member NoteProperty CreationTime $_.CreationTime

  $arr += $obj
  }
  $arr | Export-CSV -notypeinformation "$file"



if ($(get-item -path "$file").length -gt 0) {send-mailmessage -from "sysadmin@something.com" -to "jendoe@something.com","johndoe@something.com" -subject "New File Found in Corporateshare" -body "$mesg" -Attachments "$file" -smtpServer mail.somecompany.com}

Remove-Item $file



# Folder: Administration
$arr = @()
$file = "\\DesignatedNetworkDrive\NewFileFinderReport.csv"
$mesg = "Please see the attached file for a list of files that were created after May 3, 2016."


gci \\DesignatedNetworkDrive\Administration\,\\DesignatedNetworkDrive\Administration\_Private\  | Where-Object { $_.CreationTime -ge "05/04/2016" } | % {
  $obj = New-Object PSObject
  $obj | Add-Member NoteProperty FullName $_.FullName
  $obj | Add-Member NoteProperty Length $_.Length
  $obj | Add-Member NoteProperty Owner ((Get-ACL $_.FullName).Owner)
  $obj | Add-Member NoteProperty LastAccessTime $_.LastAccessTime
  $obj | Add-Member NoteProperty LastWriteTime $_.LastWriteTime
  $obj | Add-Member NoteProperty CreationTime $_.CreationTime

  $arr += $obj
  }
  $arr | Export-CSV -notypeinformation "$file"



if ($(get-item -path "$file").length -gt 0) {send-mailmessage -from "jendoe@something.com","johndoe@something.com" -body "$mesg" -Attachments "$file" -smtpServer mail.somecompany.com}

Remove-Item $file


# Folder: Procurement
$arr = @()
$file = "\\DesignatedNetworkDrive\NewFileFinderReport.csv"
$mesg = "Please see the attached file for a list of files that were created after May 24, 2016."


gci \\DesignatedNetworkDrive\Procurement\  | Where-Object { $_.CreationTime -ge "05/25/2016" } | % {
  $obj = New-Object PSObject
  $obj | Add-Member NoteProperty FullName $_.FullName
  $obj | Add-Member NoteProperty Length $_.Length
  $obj | Add-Member NoteProperty Owner ((Get-ACL $_.FullName).Owner)
  $obj | Add-Member NoteProperty LastAccessTime $_.LastAccessTime
  $obj | Add-Member NoteProperty LastWriteTime $_.LastWriteTime
  $obj | Add-Member NoteProperty CreationTime $_.CreationTime

  $arr += $obj
  }
  $arr | Export-CSV -notypeinformation "$file"



if ($(get-item -path "$file").length -gt 0) {send-mailmessage -from "jendoe@something.com","johndoe@something.com" -subject "New File Found in Procurement" -body "$mesg" -Attachments "$file" -smtpServer mail.somecompany.com}

Remove-Item $file

您將需要將該過程抽象為一個函數

將PowerShell代碼片段轉換為有用功能的關鍵是識別其中的可變部分-應該將這些可變部分轉換為參數 ,然后在調用該函數時將其傳遞給該函數。

查看您的代碼,很少有變量,即:

  • 創建日期
  • 資料夾路徑

此外,您可能希望允許可選地更改電子郵件收件人,郵件主題和SMTP服務器-這些將來可能會更改,或出於特定目的而有所不同。

考慮到這一點,我們最終得到如下結果:

function Check-NewFiles 
{
    param(
        [Parameter(Mandatory)]
        [string[]]$Path,
        [Parameter(Mandatory)]
        [datetime]$CreatedAfter,
        [string]$Subject = "New files found",
        [string[]]$Recipients = @("jendoe@something.com","johndoe@something.com"),
        [string]$MailFrom = "noreply@something.com",
        [string]$SmtpServer
    )

    # Folder: Administration
    $arr = @()
    $file = "\\DesignatedNetworkDrive\NewFileFinderReport.csv"
    $mesg = "Please see the attached file for a list of files that were created after {0:MMM dd, yyyy}" -f $CreatedAfter

    Get-ChildItem $Path  | Where-Object { $_.CreationTime -ge $CreatedAfter } | ForEach-Object {
        $obj = New-Object PSObject
        $obj | Add-Member NoteProperty FullName $_.FullName
        $obj | Add-Member NoteProperty Length $_.Length
        $obj | Add-Member NoteProperty Owner ((Get-ACL $_.FullName).Owner)
        $obj | Add-Member NoteProperty LastAccessTime $_.LastAccessTime
        $obj | Add-Member NoteProperty LastWriteTime $_.LastWriteTime
        $obj | Add-Member NoteProperty CreationTime $_.CreationTime

        $arr += $obj
    }
    $arr | Export-CSV -notypeinformation "$file"



    if ($(get-item -path "$file").length -gt 0) {
        Send-MailMessage -From $MailFrom -body "$mesg" -Attachments "$file" -smtpServer $SmtpServer -To $Recipients
    }

    Remove-Item $file
}

現在您可以每次用一行代碼調用它:

Check-NewFiles -Path \\DesignatedNetworkDrive\,\\DesignatedNetworkDrive\Corporateshare\ -CreatedAfter '07/02/2016'
Check-NewFiles -Path \\DesignatedNetworkDrive\Administration\,\\DesignatedNetworkDrive\Administration\_Private\ -CreatedAfter '05/04/2016'

對於具有大量參數的同一調用的許多實例,我喜歡使用參數實參設置哈希表的集合-這樣,我可以輕松地遍歷整個集合並在展開參數時調用函數:

$FoldersToWatch = @(
    # Folder: Corporateshare
    @{
        Path = '\\DesignatedNetworkDrive\','\\DesignatedNetworkDrive\Corporateshare\'
        CreatedAfter = "07/02/2016"
        MailFrom = "sysadmin@something.com" 
        Recipients = "jendoe@something.com","johndoe@something.com"
    },

    # Folder: Administration
    @{
        Path = '\\DesignatedNetworkDrive\Administration\','\\DesignatedNetworkDrive\Administration\_Private\'
        CreatedAfter = "05/04/2016"
        Recipients = "jendoe@something.com","johndoe@something.com"
    },

    # Folder: Procurement
    @{
        Path = '\\DesignatedNetworkDrive\Procurement\'
        CreatedAfter = "05/25/2016"
        Subject = "Procurement, IMPORTANT!"
    }
)

現在,將以上內容放入其自己的文件中,將其命名為FoldersToWatch.ps1

然后,在定義Check-NewFiles函數的腳本中,點源FoldersToWatch.ps1文件,然后遍歷哈希表並調用該函數:

# function Check-NewFiles goes up here

. .\FoldersToWatch.ps1

$FoldersToWatch |Foreach-Object {
    Check-NewFiles @_
}

那里有它。 現在,任何人都可以更新FoldersToWatch.ps1的參數,而不會弄亂腳本本身,也不會FoldersToWatch.ps1正在發生的事情。


我還想指出,使用New-ObjectAdd-Member創建新對象,然后將其添加到數組中的方法完全沒有必要。 使用Select-Object並將其直接傳遞到Export-Csv

Get-ChildItem $Path |Where-Object { $_.CreationTime -ge $CreatedAfter } |Select-Object FullName,Length,@{Label='Owner';Expression={(Get-Acl $_.FullName).Owner}},LastAccessTime,LastWriteTime,CreationTime |Export-CSV -notypeinformation "$file"

最終的功能看起來更像:

function Check-NewFiles 
{
    param(
        [Parameter(Mandatory)]
        [string[]]$Path,
        [Parameter(Mandatory)]
        [datetime]$CreatedAfter,
        [string]$Subject = "New files found",
        [string[]]$Recipients = @("jendoe@something.com","johndoe@something.com"),
        [string]$MailFrom = "noreply@something.com",
        [string]$SmtpServer
    )

    $file = "\\DesignatedNetworkDrive\NewFileFinderReport.csv"
    $mesg = "Please see the attached file for a list of files that were created after {0:MMM dd, yyyy}" -f $CreatedAfter

    Get-ChildItem $Path |Where-Object { $_.CreationTime -ge $CreatedAfter } |Select-Object FullName,Length,@{Label='Owner';Expression={(Get-Acl $_.FullName).Owner}},LastAccessTime,LastWriteTime,CreationTime |Export-CSV -notypeinformation "$file"

    if ($(get-item -path "$file").length -gt 0) {
        Send-MailMessage -From $MailFrom -body "$mesg" -Attachments "$file" -smtpServer $SmtpServer -To $Recipients
    }

    Remove-Item $file
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM