PowerShell循环读取CSV特定列值并生成邮件主题问题
PowerShell循环CSV生成对应邮件主题问题解决
问题场景
我有一个包含两列的CSV文件,列名分别为Item和Email,需求是读取每行第一列(Item)的值,并向对应行的Email列地址发送邮件。当前编写的PowerShell代码在生成邮件主题时出现问题:要么输出所有Item值的集合,要么输出列名,而我期望的是每行对应生成Report - [Item值] - [日期]格式的主题。
示例CSV
| Item | |
|---|---|
| A300 | bob@example.com |
| B600 | loco@example.net |
现有代码
$check_date = Get-Date -Format "MM-dd-yyyy" $csv = Import-Csv C:\stores_TEST.csv ForEach($line in $csv) { $ColumnName = $csv[0].PSObject.Properties.Name[0] $MailSubject = "Report - "+$csv.$ColumnName+" - "+$check_date }
问题原因
代码里有两个关键错误:
- 循环中引用了整个
$csv集合而非当前循环的$line对象,导致$csv.$ColumnName返回所有行的Item值集合,不是当前行的单个值。 - 没必要通过
$csv[0].PSObject.Properties.Name[0]获取列名,你已经明确知道第一列是Item,直接引用即可;就算要动态获取,也应该基于当前$line对象。
修正后的代码
$check_date = Get-Date -Format "MM-dd-yyyy" $csv = Import-Csv C:\stores_TEST.csv ForEach($line in $csv) { # 直接取当前行的Item值生成主题 $MailSubject = "Report - $($line.Item) - $check_date" # 这里可以添加发送邮件的逻辑,比如: # Send-MailMessage -To $line.Email -Subject $MailSubject -Body "邮件内容" -From "sender@example.com" -SmtpServer "smtp.example.com" }
补充说明
- 用
$line.Item精准获取当前行的Item值,保证每行生成对应主题。 - 用PowerShell字符串插值(
$())嵌入变量,比字符串拼接更简洁易读。 - 如果需要动态适配第一列(比如列名可能变化),可以改成:
$check_date = Get-Date -Format "MM-dd-yyyy" $csv = Import-Csv C:\stores_TEST.csv $firstColumnName = $csv[0].PSObject.Properties.Name[0] ForEach($line in $csv) { $MailSubject = "Report - $($line.$firstColumnName) - $check_date" }
内容的提问来源于stack exchange,提问作者junketsu
相关产品推荐
相关产品推荐

