我试图遍历管道描绘的文件。
文件的每一行看起来都是这样
123456|Doe Jean|2019/04/16|NOTICE_xxx|pdfname_1.pdf
NOTICE_xxx可能是大约10个三位数字之一。我当前正在遍历文本文件的每一行,将每一行拆分为一个数组$linearray
,并想用该数组中的其他一些文本替换NOTICE_xxx
。当我运行脚本时,出现此错误
您不能在空值表达式上调用方法。 在C:\ test \ ArchiveNotice_Index_Maker.ps1:12 char:8 + if($ linearry.Contains('NOTICE_320')){$ linearray [3] =“ Notc-Notic ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidOperation:(:) [],RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull
我尝试使用if elseif语句,但似乎不起作用。
#Set Fold Directory
$fileDirectory = "C:\test\"
#Loop though each line in file
foreach($line in Get-Content -Path $fileDirectory\index.txt){
$splitter = "|"
$linearray = $line.Split($splitter)
#Replace Notice Type With Notice Name
if($linearry.Contains('NOTICE_320')){$linearray[3] = "Notice Name 1"}
elseif($linearry.Contains('NOTICE_322')){$linearray[3] = "Notice Name 2"}
elseif($linearry.Contains('NOTICE_333')){$linearray[3] = "Notice Name 3"}
elseif($linearry.Contains('NOTICE_351')){$linearray[3] = "Notice Name 4"}
elseif($linearry.Contains('NOTICE_370')){$linearray[3] = "Notice Name 5"}
elseif($linearry.Contains('NOTICE_372')){$linearray[3] = "Notice Name 6"}
$noticeType = $linearray[3]
write-host("$noticeType")
}
答案 0 :(得分:0)
如Lee Dailey所建议,可以通过将文件视为管道分隔的CSV文件(听起来像这样)来简化此过程。我还建议使用sum
语句,而不要使用大量的Switch
语句。假设您没有标题,则可以执行以下操作:
If/ElseIf
如果您确实有标头,则可以省略#Set Fold Directory
$fileDirectory = "C:\test\"
#Import data
$Data = Import-Csv -Path $fileDirectory\index.txt -Delimiter '|' -Header 'ID','Name','Date','Notice','File'
#Loop though each line in file, and update Notice field
Switch ($Data){
{$_.Notice -eq 'NOTICE_320'}{$_.Notice = "Notice Name 1"}
{$_.Notice -eq 'NOTICE_322'}{$_.Notice = "Notice Name 2"}
{$_.Notice -eq 'NOTICE_333'}{$_.Notice = "Notice Name 3"}
{$_.Notice -eq 'NOTICE_351'}{$_.Notice = "Notice Name 4"}
{$_.Notice -eq 'NOTICE_370'}{$_.Notice = "Notice Name 5"}
{$_.Notice -eq 'NOTICE_372'}{$_.Notice = "Notice Name 6"}
}
部分,并更新-header
以匹配标头名称。
或者,您可以使用哈希表来设置以下值:
.Notice
同样,标题,不包含标题,就像第一个示例一样。