Select-String -Pattern $ variable问题

时间:2016-09-01 21:26:28

标签: powershell

我试图通过交叉引用两个文本文档来创建报告。我有C:\ formeremployees.txt和C:\ shareaudit.txt。您可以猜测formeremployees.txt只有一个以前的员工用户名列表。没有标题;只有用户名。 C:\ shareaudit.txt包含共享中每个文件夹的列表,其中ACL信息位于文件夹路径旁边的同一行。

以下是我尝试创建的报告,该报告仅列出了来自formeremployees.txt的用户帐户的行:

$Users = Get-Content C:\formeremployees.txt

foreach ($User in $Users) {
  $Output = Select-String -Path "C:\Shareaudit.txt" -Pattern "$User"
  $Output.Line | Out-File C:\completereport.txt -Append
}

但不幸的是,我收到以下错误:

Select-String : Cannot bind argument to parameter 'Pattern' because it is an
empty string.
At line:7 char:71
+ $Output = Select-String -Path "C:\Shareaudit.txt" -Pattern "$User"
+                                                            ~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Select-String], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.SelectStringCommand

Select-String : Cannot bind argument to parameter 'Pattern' because it is an
empty string.
At line:7 char:71
+ $Output = Select-String -Path "C:\ShareAudit.txt" -Pattern "$User"
+                                                            ~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Select-String], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.SelectStringCommand

然后我得到一个悲伤,空的completereport.txt文件。我似乎不能让这个工作或知道它是否可能。

编辑________________________

这是我尝试过的其他内容以及结果:

$Users = Get-Content C:\formeremployees.txt|?{!([string]::IsNullOrWhitespace($_))}

foreach ($User in $Users) {
  $Output = Select-String -Path "C:\Shareaudit.txt" -Pattern "$User"
  $Output.Line | Out-File C:\completereport.txt -Append
}

这给了我一个空白的C:\ completereport.txt文件。

$Users = Get-Content C:\formeremployees.txt|?{!([string]::IsNullOrWhitespace($_))}
$Pattern = ($Users|ForEach{[regex]::escape($_)}) -join '|'
Get-Content "C:\Shareaudit.txt" | Where{$_ -match $Pattern} | Set-Content C:\completereport.txt 

据我所知,没有做任何事情。完成后没有创建completereport.txt文档。

$Users=(Get-Content C:\formeremployees.txt) -ne ''

foreach ($User in $Users) {
  $Output = Select-String -Path "C:\Shareaudit.txt" -Pattern "$User"
  $Output.Line | Out-File C:\completereport.txt -Append
}

这给了我一个空白的文本文件。

 $Output = Select-String -Path "C:\Shareaudit.txt" -Pattern "<single username from formeremployeee.txt>"
  $Output.Line | Out-File C:\completereport.txt -Append

当我输入一个我知道仍然拥有共享中某些文件夹权限的用户名并且也​​位于formeremployee.txt中时,该脚本按预期工作,并为我提供了我需要的文件夹列表,因此有&#39;脚本的底部部分没什么问题,所以我猜测formeremployee.txt或者我使用$ Users变量的方式。

为了进一步测试,我尝试了这个:

$Users=(Get-Content C:\formeremployees.txt) -ne ''

foreach ($User in $Users) {
  Select-String -Path "C:\Shareaudit.txt" -Pattern "$User"
}

这并没有输出任何结果。 formeremployee.txt文件的文本列出了用户名,如下所示:

username1
username2
username3
username4

它的格式是否错误?

1 个答案:

答案 0 :(得分:3)

最明显的答案是您的FormerEmployee.txt文件中有空行。最简单的解决方案是更新您的第一行:

$Users = Get-Content C:\formeremployees.txt|?{!([string]::IsNullOrWhitespace($_))}

我可能采取的措施是加快用户的正则表达式模式,并运行Select-String一次,而不是每个用户一次:

$Users = Get-Content C:\formeremployees.txt|?{!([string]::IsNullOrWhitespace($_))}
$Pattern = ($Users|ForEach{[regex]::escape($_)}) -join '|'
Get-Content "C:\Shareaudit.txt" | Where{$_ -match $Pattern} | Set-Content C:\completereport.txt