2017-04-25 50 views
0

匹配我有我用它来重新排序包含多个条形码的列表(6个的一串数字的格式),Word文档和用户信息的收集到的信息的PowerShell脚本一个电子表格和任何有未知条码的用户进入另一个。我想添加一行以将任何没有条形码的用户包括到未知的条形码文件中,因为当前这些用户正在处理中丢失。找到,如果正则表达式是不是在PowerShell中

我有一个正则表达式,我用来挑出条形码,并且我已经尝试检查$ matches变量的$ matches -eq''或$ matches -eq $ null,它返回无输出或每个用户该表格,分别。我也尝试检查我存储条形码的变量是否为$ null或空的结果相同。最后,我试图编写另一个正则表达式来检查条形码是否与条形码进入的格式不匹配,从而返回表单上的每个用户。

这里是我一起工作的字段和它们的特性的一个示例:

#This is the field which would contain barcodes. Note that there are several instances 
#of fields with this name in any given sheet. The text is stored in the Result property, 
#and for this field it should include a listing of 6-digit numbers possibly including 
#letters to indicate the type of equipment the barcode represents. It will sometimes 
#contain notes from whomever filled the sheet in. 
Application  : Microsoft.Office.Interop.Word.ApplicationClass 
Creator   : **REDACTED** 
Parent   : Microsoft.Office.Interop.Word.DocumentClass 
Type   : 70 
Name   : Text10 
EntryMacro  : 
ExitMacro  : 
OwnHelp   : False 
OwnStatus  : False 
HelpText  : 
StatusText  : 
Enabled   : True 
Result   : EQUIPMENT WAS ALREADY MOVED 
TextInput  : System.__ComObject 
CheckBox  : System.__ComObject 
DropDown  : System.__ComObject 
Next   : System.__ComObject 
Previous  : System.__ComObject 
CalculateOnExit : False 
Range   : System.__ComObject 
------------------------------------------------ 
Application  : Microsoft.Office.Interop.Word.ApplicationClass 
Creator   : **REDACTED** 
Parent   : Microsoft.Office.Interop.Word.DocumentClass 
Type   : 70 
Name   : Text10 
EntryMacro  : 
ExitMacro  : 
OwnHelp   : False 
OwnStatus  : False 
HelpText  : 
StatusText  : 
Enabled   : True 
Result   : 
TextInput  : System.__ComObject 
CheckBox  : System.__ComObject 
DropDown  : System.__ComObject 
Next   : System.__ComObject 
Previous  : System.__ComObject 
CalculateOnExit : False 
Range   : System.__ComObject 
----------------------------------------------- 
Application  : Microsoft.Office.Interop.Word.ApplicationClass 
Creator   : **REDACTED** 
Parent   : Microsoft.Office.Interop.Word.DocumentClass 
Type   : 70 
Name   : Text10 
EntryMacro  : 
ExitMacro  : 
OwnHelp   : False 
OwnStatus  : False 
HelpText  : 
StatusText  : 
Enabled   : True 
Result   : L 123456, M 654321, 456789, D 987654 
TextInput  : System.__ComObject 
CheckBox  : System.__ComObject 
DropDown  : System.__ComObject 
Next   : System.__ComObject 
Previous  : System.__ComObject 
CalculateOnExit : False 
Range   : System.__ComObject 

这里是我与使用的代码(其离开关闭用户没有条形码隔开正常使用),其中包括我最近在挑选这些用户尝试失败:

$word = New-Object -ComObject Word.Application 
$word.Visible = $false 
$word.DisplayAlerts = "wdAlertsNone" 
$results = "Header1,Header2,Header3,Header4`n" 
$exceptions = "Header2,Header3,Header4`n" 
$list = get-childitem 'H:\directory' 
foreach($file in $list){ 
    $path = "H:\directory\$($file.name)" 
    $doc = $word.Documents.Open($path) 
    $fields = $doc.FormFields 
    foreach($field in $fields){ 
     if ($field.name -eq 'Text2'){ 
      $ucc = $field.Result.Replace('/',",") 
      $ucc = $ucc.Replace('/',',') 
     } 
     elseif($field.name -eq 'Text5'){ 
      $loc = $field.Result 
      } 
      $loc = $loc.Trim() 
     } 
     elseif($field.name -eq 'Text10'){ 
      if($field.result -like '*UNK*'){ 
       $exceptions+=$loc + "," + $ucc+"`n" 
      } 
      #this is where I am storing the barcodes 
      $bar = @([regex]::matches($field.Result,'\D*(\d{6})')|%{$_.groups[1].value}) 
      #this is my attempt at picking out blank codes 
      if([regex]::Match($field.result,"*(\d[6])*") -ne $true){ 
       $exceptions+=$loc + "," + $ucc + "`n" 
      } 
      foreach($code in $bar){ 
       $results += $code + "," + $loc + "," + $ucc+"`n" 
      } 
     } 
    } 
} 
$exceptions | out-file 'H:\directory\exceptions.csv' -Encoding ascii -Force 
$results | out-file 'H:\directory\list.csv' -Encoding ascii -Force 
$word.quit() 
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($word) 
+1

请提供完整[mcve]的样本输入和所需输出。也许考虑格式化(例如换行符,段落)以使问题更具可读性。 – Yunnosch

+0

'“*(\ d [6])*”'看起来像匹配“任意数量绝对没有的(可能语法错误),随后通过任何数量的数字和图6的捕获基团的”。对正则表达式有什么不寻常的地方吗? – Yunnosch

+0

让我们[继续聊天讨论](http://chat.stackoverflow.com/rooms/142654/discussion-between-yunnosch-and-cameron)。 – Yunnosch

回答

1

你可以重组事情有点用Where语句来完成此传送到ForEach循环,并利用自动变量$Matches

  $bar = $field.Result | Where{$_ -match '\D*(\d{6})'} | ForEach{$Matches[1].value} 
      If(!$bar -eq $null){ 
       foreach($code in $bar){ 
        $results += $code + "," + $loc + "," + $ucc+"`n" 
       } 
      }Else{ 
       $exceptions+=$loc + "," + $ucc + "`n" 
      } 

编辑:我在某些对象来模拟你的样本数据增加,并且为每一个我产生了$loc$ucc变量的一些随机的字母。然后我只是输出到屏幕而不是文件。以下是我正在看的:

$letters= 97..123|%{[char]$_} 
$fields = @(
    [pscustomobject]@{'Name' = 'Text10';'Result' = @('asdf123456','dasrew345678','fdswer098765')}, 
    [pscustomobject]@{'Name' = 'Text10';'Result' = 'EQUIPMENT WAS ALREADY MOVED'}, 
    [pscustomobject]@{'Name' = 'Text10';'Result' = ''} 
) 
foreach($field in $fields){ 
    $loc = (Get-Random -Count 5 -InputObject $letters) -join '' 
    $ucc = (Get-Random -Count 5 -InputObject $letters) -join '' 
    if ($field.name -eq 'Text2'){ 
     $ucc = $field.Result.Replace('/',",") 
     $ucc = $ucc.Replace('/',',') 
    } 
    elseif($field.name -eq 'Text5'){ 
     $loc = $field.Result 
     #} 
     $loc = $loc.Trim() 
    } 
    elseif($field.name -eq 'Text10'){ 
     if($field.result -like '*UNK*'){ 
      $exceptions+=$loc + "," + $ucc+"`n" 
     } 
     $bar = $field.Result | Where{ $_ -match '\D*(\d{6})' } | ForEach {$Matches[1]} 
     If(!($bar -eq $null)){ 
      foreach($code in $bar){ 
       "results+=$code + `",`" + $loc + `",`" + $ucc" 
      } 
     }Else{ 
      "exceptions+=$loc + `",`" + $ucc" 
     } 
    } 
} 

输出5行。第一个对象为三个,全部用于相同的“用户”,对于loc和ucc,相同的5个字符,然后每行一个条形码。然后输出另外2行用于没有条形码的记录。

results+=123456 + "," + vpsjt + "," + lmsyv 
results+=345678 + "," + vpsjt + "," + lmsyv 
results+=098765 + "," + vpsjt + "," + lmsyv 
exceptions+=hbptn + "," + ugydn 
exceptions+=ygbop + "," + zy{mt 
+0

感谢您改进的正则表达式,我将在我的代码中使用它。但是,这种循环方式仍然会将每个用户和字段作为单独的行返回,而不管它们是否具有条形码。 – Cameron

+0

当我使用您的示例数据并替换脚本中的相关代码时,它会给出我想要的结果。 – TheMadTechnician

+0

该示例数据的问题在于它是一系列字符串,它们表示从powershell控制台发现的内容。实际数据包括2-8个字段,其中可能包含或不包含条形码,每个字段具有相同名称,超过20多个单词文档。我没有办法在没有上传单词文件的情况下准确地抄写这些文件,这是因为几个原因而不可能的。 – Cameron