PowerShell:将 foreach 中的当前项设置为数组

PowerShell: Set current item in foreach to an array

感谢您的观看。我想遍历文件夹中的每个项目并将符合条件的文件名和长度(大小)添加到数组中,以便我可以发送电子邮件。例如,如果有不带 .txt 扩展名的文件,我不想包含它们。发生的情况是电子邮件已发送出去,但在多个表格中列出了相同的文件。我知道问题是否在于我如何将当前文件存储到数组,但不确定如何修复它。我只是想让foreach中的当前文件添加一次。

这是我的代码:

$myFolder = "C:\Users\myName\Documents\Temporary"
$ReceivedCount = 0

$a = "<style>BODY{font-family: Verdana; font-size: 9pt;}"
$a = $a + "BODY{background-color:white;}"
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color:    black;border-collapse: collapse; }"  
$a = $a + "TH{border-width: 2px;padding: 7px;border-style: solid;border-color:    black;background-color:lightblue;padding-right: 2px;}" 
$a = $a + "TD{border-width: 2px;padding: 5px;border-style: solid;border-color:     black;background-color:white; padding-right: 2px;}"
$a = $a + "</style>" 

foreach ($file in $myFolder)
{
    $FileName = $file.name

    Echo "Curent file: $FileName"

    if($FileName -like "*.txt")
    {
        $ReceivedCount += 1
        # This is the section I'm doing wrong:
        $FilesReceived += @(Select-Object name , length | ConvertTo-HTML -head        $a)
    }

}

Echo "Found $ReceivedCount files."

if ($FilesReceivedCount -gt 0)
{
    #send email...
}

尝试以下操作:

#$FilesReceived = @()
$FilesReceived += @($file | Select-Object name , length)

$html = $FilesReceived | Convertto-html -head $a

顺便说一下,如果你像这样使用 gci 的 -include 参数,你可以预先过滤文件选择:

Get-Childitem C:\path\*.* -Include *.txt

所以你只处理 .txt 文件

如果您只想将文件包含在 table 中(而不是稍后在数组中使用它们),您可以只使用:

$filenames = Get-ChildItem -Path $myFolder "*.txt" | Select-Object Name | ConvertTo-Html -Fragment

这将创建一个仅包含文件名的 table(如果需要,请将参数添加到 select 对象)。我在 get-childitem 上使用 select-object 而不是 -name 标志的管道,因为该标志将包含完整路径,而 select-object 仅包含名称。