【发布时间】:2016-08-17 09:38:57
【问题描述】:
我希望有 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
【问题讨论】:
-
看起来最简单的方法是让它使用 Import-CSV 从配置文件中提取信息,然后使用 ForEach 循环遍历它。如果你想让它编码得很好,你可能也应该把它分成函数——例如,参见 Mathias 的答案。
标签: csv powershell