2016-08-17 34 views
0

私はこのスクリプトをどのようにループできるかについて、PowerShellの経験を積んだ人ができるだけ親切に助言してくれることを願っています。残念ながら、私たちはPowerShellスクリプトのループをまだ熟知しておらず、これを実行する最善の方法/方法についていくつかのアドバイスを探しています。指定された日付から始まる指定されたフォルダおよび/またはフォルダ内に新しいファイルが作成され、削除されるファイルをリストした.csvファイルが含まれている場合、従業員に電子メールアラートを送信するためにスクリプトを使用します。アラートの送信後に.csvファイルを生成する必要はありません。今はコードを何度もコピーして貼り付け、新しいフォルダが追加されたときにコードの一部を変更しています。しかし、私たちの懸念は、結局のところ、週/月/年が経過するとフォルダが追加され、新しいフォルダを追加する必要があるため、このファイルはページ長になります。PowerShellスクリプトループ - 作成された新しいファイルの作成

私たちがスクリプトに対して行う唯一の変更は、ネットワークドライブを見るためのフォルダパス、作成時間、およびそれが行われる受信者です。

これを達成するための最善の方法についてのアドバイスは、このすべてまたはいずれかを達成することは非常に感謝しています。

ありがとうございます!

$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 "[email protected]" -to "[email protected]","[email protected]" -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 "[email protected]","[email protected]" -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 "[email protected]","j[email protected]" -subject "New File Found in Procurement" -body "$mesg" -Attachments "$file" -smtpServer mail.somecompany.com} 

Remove-Item $file 
+0

はそれから情報を引き出す持っているだろう。最終関数が得られ

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" 

は、より多くのように見えますImport-CSVを使用してconfigファイルを編集し、ForEachでループします。それをうまくコーディングするには、それを関数にも分割するべきでしょう - 例についてのMathiasの答えを参照してください。 – Larkeith

答えて

5

あなたは離れて機能に抽象化の手順にお勧めします。

便利な機能にPowerShellのコードのスニペットを回すための鍵は、それの変数部品を特定することである - これらは、それを呼び出すときに、関数に渡すことができますパラメータにオンにする必要があります。

あなたのコードを見てみると、非常に少数の部品変数、すなわち:

  • 作成日
  • フォルダのパス

はまた、あなたは、電子メールの受信者のオプションの変更を許可することができます、メールの件名とSMTPサーバー - これらは将来変更されるか、特定の目的のために逸脱する可能性があります。念頭に置いて

、我々のようなもので終わる:今、あなたは単一のコード行をするたびにそれを呼び出すことができます

function Check-NewFiles 
{ 
    param(
     [Parameter(Mandatory)] 
     [string[]]$Path, 
     [Parameter(Mandatory)] 
     [datetime]$CreatedAfter, 
     [string]$Subject = "New files found", 
     [string[]]$Recipients = @("[email protected]","[email protected]"), 
     [string]$MailFrom = "[email protected]", 
     [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' 

を私はパラメータの引数を持つハッシュテーブルのコレクションを設定するのが好きです。つまり、コレクション全体を簡単にループして関数を呼び出すことができます。splattingパラメータ:

$FoldersToWatch = @(
    # Folder: Corporateshare 
    @{ 
     Path = '\\DesignatedNetworkDrive\','\\DesignatedNetworkDrive\Corporateshare\' 
     CreatedAfter = "07/02/2016" 
     MailFrom = "[email protected]" 
     Recipients = "[email protected]","[email protected]" 
    }, 

    # Folder: Administration 
    @{ 
     Path = '\\DesignatedNetworkDrive\Administration\','\\DesignatedNetworkDrive\Administration\_Private\' 
     CreatedAfter = "05/04/2016" 
     Recipients = "[email protected]","[email protected]" 
    }, 

    # 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のパラメータを更新できます。


私はまた、あなたがNew-ObjectAdd-Memberで新しいオブジェクトを作成する方法と、配列への追加が完全に不要であることを指摘したいと思います。 Export-CsvにまっすぐSelect-Objectとパイプを使用します。それは、これを行うための最も簡単な方法のように思える

function Check-NewFiles 
{ 
    param(
     [Parameter(Mandatory)] 
     [string[]]$Path, 
     [Parameter(Mandatory)] 
     [datetime]$CreatedAfter, 
     [string]$Subject = "New files found", 
     [string[]]$Recipients = @("[email protected]","[email protected]"), 
     [string]$MailFrom = "[email protected]", 
     [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 
} 
+0

これに加えて、ファイルからパラメータを取り出すことをお勧めします。最も簡単な解決方法は、Import-CSVを使用してForEachループを使用するか、Invoke-Commandを呼び出すことです。 – Larkeith

+1

@Larkeith私は通常、関数呼び出し用のスプラットテーブルを持つ2番目のスクリプトを定義しました。 –

+0

@ MathiasR.Jessenありがとうございます。徹底的な対応を本当に感謝します。私の学習経験には最高です。 – st4evr

関連する問題