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 仅包含名称。
感谢您的观看。我想遍历文件夹中的每个项目并将符合条件的文件名和长度(大小)添加到数组中,以便我可以发送电子邮件。例如,如果有不带 .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 仅包含名称。