当powershell中CVS的任何一个字段为空时,如何删除整行?

当powershell中CVS的任何一个字段为空时,如何删除整行?,powershell,csv,Powershell,Csv,删除此处的第二行和最后一行根据您的评论,如果从CSV文件读取$data,并且包含自定义对象,则可以执行以下操作: ProcessName UserName PSComputerName AnyDesk NT-AUTORITÄT\SYSTEM localhost csrss dc-01 ctfmon SAD\Administrator rdscb-01 SAD\Adm

删除此处的第二行和最后一行

根据您的评论,如果从CSV文件读取
$data
,并且包含自定义对象,则可以执行以下操作:


ProcessName UserName             PSComputerName

AnyDesk     NT-AUTORITÄT\SYSTEM  localhost
csrss                            dc-01
ctfmon      SAD\Administrator    rdscb-01
            SAD\Administrator    srv-01


这将适用于每个属性,并且不需要提供命名属性。

根据您的评论,如果从CSV文件读取
$data
,并且包含自定义对象,则可以执行以下操作:


ProcessName UserName             PSComputerName

AnyDesk     NT-AUTORITÄT\SYSTEM  localhost
csrss                            dc-01
ctfmon      SAD\Administrator    rdscb-01
            SAD\Administrator    srv-01


这将适用于每个属性,并且不需要提供命名属性。

还有更优雅的方法,但是,这里有一种丑陋的答案,来说明这一点

$data | where { $_.PsObject.Properties.Value -notcontains $null -and $_.PsObject.Properties.Value -notcontains '' }
$Data=@”
“进程名”、“用户名”、“PSComputerName”
“任意桌面”、“NT-AUTORITÄT\SYSTEM”、“本地主机”
“csrss”、“dc-01”
“ctfmon”、“SAD\Administrator”、“rdscb-01”
“”、“SAD\Administrator”、“srv-01”
“@|输出文件-文件路径'D:\Temp\ProcData.csv'
$headers=(
(获取内容-路径“D:\Temp\ProcData.csv”)-replace'',''|
选择-第一个1
)-拆分','
$data=导入Csv-路径“D:\Temp\ProcData.Csv”
$colCnt=$headers.count
$lineNum=0
:换行符
foreach($数据中的行)
{
$lineNum++
对于($i=0;$i-lt$colCnt;$i++)
{
#测试单元格的内容是否为空
if(-not$line.$($headers[$i]))
{
写入警告-消息“$($lineNum):$($headers[$i])为空”
继续换行
}
}
“$($lineNum):确定”
#使用良好的数据执行其他操作
}

还有更优雅的方式,但是,这里有一种丑陋的答案,来说明这一点

$data | where { $_.PsObject.Properties.Value -notcontains $null -and $_.PsObject.Properties.Value -notcontains '' }
$Data=@”
“进程名”、“用户名”、“PSComputerName”
“任意桌面”、“NT-AUTORITÄT\SYSTEM”、“本地主机”
“csrss”、“dc-01”
“ctfmon”、“SAD\Administrator”、“rdscb-01”
“”、“SAD\Administrator”、“srv-01”
“@|输出文件-文件路径'D:\Temp\ProcData.csv'
$headers=(
(获取内容-路径“D:\Temp\ProcData.csv”)-replace'',''|
选择-第一个1
)-拆分','
$data=导入Csv-路径“D:\Temp\ProcData.Csv”
$colCnt=$headers.count
$lineNum=0
:换行符
foreach($数据中的行)
{
$lineNum++
对于($i=0;$i-lt$colCnt;$i++)
{
#测试单元格的内容是否为空
if(-not$line.$($headers[$i]))
{
写入警告-消息“$($lineNum):$($headers[$i])为空”
继续换行
}
}
“$($lineNum):确定”
#使用良好的数据执行其他操作
}

这是一个程序员问答网站;到目前为止,我看不到你尝试过的任何问题或代码显示您的代码和错误。这并不是一件复杂的事情,因为在web和Youtube上有很多关于文件和字符串解析(csv/txt)用例的文章,使用比较运算符、Select string、ConvertFrom string cmdlet或RegEx。我们可以提供帮助,但我们需要了解您到目前为止所做的工作。@postanote我可以通过对每一行使用“-ne”来做到这一点,但这对我来说太多了,所以我只想得到一个动态解决方案。我没有找到任何动态解决方案。“$data=$data |选择对象ProcessName、UserName、PSComputerName | Where对象{$$\用户名-ne”“}|格式表”您的集合可能来自CSV文件,但我认为这不是CSV特有的问题。接近,但会筛选出空属性而不是具有空属性的对象。实际上不是这样,因为您要导入csv文件,它一次只能导入一行,因此处理每一行是一件谨慎的事情。但听起来像是在问,您希望动态捕获所有列,而不管返回的列数是多少,在处理行时使用标题名,同时使用该捕获列名验证该单元格的内容。这需要重新定义文件,捕获列,然后处理行。因此,您至少需要为循环设置计数器。这仍然是每行menas-not或-ne,同时动态获取列标题;到目前为止,我看不到你尝试过的任何问题或代码显示您的代码和错误。这并不是一件复杂的事情,因为在web和Youtube上有很多关于文件和字符串解析(csv/txt)用例的文章,使用比较运算符、Select string、ConvertFrom string cmdlet或RegEx。我们可以提供帮助,但我们需要了解您到目前为止所做的工作。@postanote我可以通过对每一行使用“-ne”来做到这一点,但这对我来说太多了,所以我只想得到一个动态解决方案。我没有找到任何动态解决方案。“$data=$data |选择对象ProcessName、UserName、PSComputerName | Where对象{$$\用户名-ne”“}|格式表”您的集合可能来自CSV文件,但我认为这不是CSV特有的问题。接近,但会筛选出空属性而不是具有空属性的对象。实际上不是这样,因为您要导入csv文件,它一次只能导入一行,因此处理每一行是一件谨慎的事情。但听起来像是在问,您希望动态捕获所有列,而不管返回的列数是多少,在处理行时使用标题名,同时使用该捕获列名验证该单元格的内容。这需要重新定义文件,捕获列,然后处理行。因此,您至少需要为循环设置计数器。这仍然是每行menas-not或-ne,同时动态获取列标题。.-}--正如我上面所说,更优雅的方式是存在的,正如事物的管理所显示的一样谢谢,@AdminOfThings它似乎在工作,但当我只是使用“-ne”而不是“-notcontains”时它就不工作了。是的,你不能将
-ne
$\upsObject.Properties.Value
一起使用,因为
.Value
将返回一个集合<代码>-notcontains
用于包含,以将单个项与项集合进行比较。.-}--正如我上面所说,更优雅的方式是存在的,正如事物的管理所显示的一样“谢谢你,”他说