我正在尝试编写PowerShell脚本以检查列数,并查看其是否满足条件,否则抛出错误或发送电子邮件。 我尝试过的东西:
$columns=(Get-Content "C:\Users\xs15169\Desktop\temp\OEC2_CFLOW.txt" | select -First 1).Split(",")
$Count=columns.count
if ($count -eq 280)
echo "column count is:$count"
else
email
答案 0 :(得分:0)
我将假定您的文本文件为CSV格式,如果它是文本文件表且未格式化为CSV,我无法想象您使用的是哪种格式。
处理CSV文件,并计算所得Powershell对象的属性数量。
$columnCount = @( ( Import-Csv '\path\to\file.txt' ).PSObject.Properties ).Count
我们需要强制Properties
对象到数组(这是@()
语法)以准确地获取计数。 PSObject
属性是有关Powershell中某个对象的元数据的隐藏属性,我们可以在其中查找Properties
(列名)并获取数量。
如果CSV没有标题,则Import-Csv
要求您手动指定标题。您可以通过技巧来即时建立唯一的列名,但是对于仅获取列数而言,它们太复杂了。
要采用您在上面已经尝试过的方法,我们可以在第一行中获取数据并处理列数,尽管您在问题中做得不正确。正确操作的方法如下:
$columnCount = ( ( Get-Content "\path\to\file.txt" | Select-Object -First 1 ) -Split ',' ).Count
以上两种解决方案都可以使列数减少到一行代码。但是在您的原始样本中,您犯了一些小错误:
$columns=( Get-Content "\path\to\file.txt" | select -First 1 ).Split(",")
# You forgot to prepend "columns" with a $. Should look like the below line
$Count=$columns.count
您忘记在if
块中使用花括号:
if ($count -eq 280) {
echo "column count is:$count"
} else {
email
}
对于使用-Split
运算符与.Split()
方法而言,这纯粹是样式方面的偏爱,而使用Split()
是完全有效的。