【问题标题】:PowerShell: Set current item in foreach to an arrayPowerShell:将 foreach 中的当前项目设置为数组
【发布时间】:2015-03-17 15:54:30
【问题描述】:

感谢您的关注。我想遍历文件夹中的每个项目并将合格的文件名和长度(大小)添加到数组中,以便我可以发送电子邮件。例如,如果有没有 .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...
}

【问题讨论】:

  • 你在哪里清除FilesReceivedSelect-Object 在那里操作什么对象?
  • 我不清除 $FilesRecieved 因为一旦这个脚本运行它就完成了。 Select-Object 应该只在 foreach 循环中获取当前文件的名称和长度。
  • 那么你在这里输出什么多个表,这里没有任何循环(除了文件之外)?示例输入和输出可能会有所帮助。
  • 所以比如我有四个文件,taco.txt、nachos.txt、salsa.txt和order.log。当我发送邮件消息时,我想通过电子邮件发送一个表格,其中列出了每个 *.txt 文件的名称和大小。代码现在所做的是,当我发送电子邮件时,它将三个文件中的每一个都列在单独的表中。
  • 您正在为每个文件运行一次convertto-html。如果你想要一个表,我相信你需要在整个集合上运行一次。

标签: arrays powershell foreach


【解决方案1】:

尝试以下方法:

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

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

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

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

所以你只处理 .txt 文件

【讨论】:

  • 好的,这确实有效,但是当我发送电子邮件时,每个文件都列在单独的表格中。知道如何让他们去一张桌子吗?
  • @AaronJohnsen 我已经编辑了代码。如果您使用 $html 变量,您应该只有 1 个表
  • 是的!刚刚在 Convertto-html 之后添加了 -head $a,这正是我所需要的,非常感谢你们。你们是很棒的人。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多