powershell - Powershell在txt文件中输出记录列表
问题描述
在 powershell 中运行以下命令
$files = Get-ChildItem -path "C:\temp" -Recurse -Include "*.csv"
ForEach($BusinessFile in $BusinessFiles)
{
$bfiles = get-content $BusinessFile.fullname | Measure-Object -line
$bRowsinFile = $bfiles.lines -1
write-host "Business File Name: " $BusinessFile.name
Write-host "Number of Rows: " $bRowsinFile -ForegroundColor Yellow
}
$records =@{
"File Name" = $businessFile.Name
"Number of Rows" = $bRowsinFile
}
}
$listofFiles = @()
$listofFiles += New-Object -TypeName PSObject -Property $records
$listofFiles | Out-File "c:\test\output.txt"
Invoke-Item "c:\test\output.txt"
基于 write-host 命令的 Powershell 工作正常。它给出了每个 CSV 文件名以及每个文件上的行数
输出问题:我只看到 output.txt 文件中的第一个文件名
输出显示:仅第一个文件的文件名和 # 行
目标: output.txt 是否可以列出所有文件名以及相应的行数
谢谢
解决方案
您的问题是您错误地尝试在循环之后而不是在循环内部$listofFiles += ...
构建结果数组( )foreach
- 正确缩进源代码,该问题会更加明显。
此外,您可以大大简化解决方案。
$listOfFiles = Get-ChildItem C:\temp -Recurse -Filter *.csv | ForEach-Object {
[pscustomobject] @{
'File Name' = $_.Name
'Number of Rows' = (Get-Content $_.FullName | Measure-Object -Line).Lines - 1
}
}
在命令中[pscustomobject]
手动构建的替代方法是使用计算属性,如TheMadTechnician 的答案所示。也就是说,考虑到在手头的情况下,您需要两个计算属性 - 一个用于计算行数,另一个用于将属性重命名为,增加的冗长可能不值得。ForEach-Object
Select-Object
Name
File Name
警告:正如Compo所指出的,如果您的 CSV 文件有可能包含跨越多行的单个行(这种情况很少见),请用于(Import-Csv $_.FullName | Measure-Object).Count
计算该Number of Rows
字段,但请注意这会更慢。
笔记:
如果您的 CSV 文件足够小以适合整个内存(一次一个),您可以通过使用
(Get-Content $_.FullName).Count - 1
计算行数来加快您的命令。请参阅此答案,了解为什么不建议使用迭代“扩展”数组
+=
,以及如何将偶数foreach
循环用作表达式,其多个输出可以通过分配给变量直接收集在数组中。
推荐阅读
- swift - swift:如何删除部分音频?
- python - 如何为pyplot中的每个x值在y轴上绘制平均值
- android - GraphQL:配置订阅管理器
- protractor - 如何使用量角器测试物化图标?
- php - 如何在不更改数据库字符集的情况下显示菱形问号中的正确字符?
- cron - 考虑到今天的日期是 2018 年 12 月 26 日,我必须配置在每个工作日(周一至周五)下午 2 点开始日期 2019 年 1 月 5 日运行的作业
- python - TypeError:尝试获取用户输入时,“元组”对象不可调用
- reactjs - 在 react-router v4 中加载 url 时组件不呈现
- oracle - 将两行合并为一行,其中一列具有不同的值
- c# - 有没有办法在不分配的情况下将通用枚举值转换为 UInt64 值?