【问题标题】:Use txt file as list in PowerShell array/variable使用 txt 文件作为 PowerShell 数组/变量中的列表
【发布时间】:2018-02-08 17:20:54
【问题描述】:

我有一个搜索字符串的脚本(在本例中为“结束程序”)。然后它遍历文件夹中的每个文件并输出任何不包含该字符串的文件。

当短语被硬编码时,它可以完美地工作,但我想通过创建一个文本文件来保存字符串,使其更具动态性。将来,我希望能够添加到文本文件中的字符串列表中。我无法在任何地方在线找到此内容,因此非常感谢您的帮助。

当前代码:

$Folder = "\\test path"
$Files = Get-ChildItem $Folder -Filter "*.log" |
         ? {$_.LastWriteTime -gt (Get-Date).AddDays(-31)} 

# String to search for within the file
$SearchTerm = "*End program*"

foreach ($File in $Files) {
    $Text = Get-Content "$Folder\$File" | select -Last 1

    if ($Text | WHERE {$Text -inotlike $SearchTerm}) {
        $Arr += $File
    }
}
if ($Arr.Count -eq 0) {
   break
}

这是代码的简化版本,仅显示有问题的区域。我想把“结束程序”和另一个字符串“结束”放在一个文本文件中。

文件内容如下:

*结束程序*,*开始*

【问题讨论】:

  • 那么,基本上你想要一个包含一些搜索词的文件,并且你想枚举所有不包含这些词的文件?
  • 我认为您可以使用Get-Content 从文本文件中获取值。您只需要知道文本文件的名称或名称的模式,然后使用Get-ChildItem 扫描目录中的文本文件。
  • @AnsgarWiechers 是的,这就是我需要做的。
  • @JasonSnell 我已经做到了,当文件中只有一个短语而不是多个短语时,它就可以工作了

标签: arrays powershell csv text-files powershell-3.0


【解决方案1】:

如果您想检查文件是否包含(或不包含)多个给定术语,最好使用正则表达式。从文件中读取条款,将其转义,然后将其加入alternation

$terms = Get-Content 'C:\path\to\terms.txt' |
         ForEach-Object { [regex]::Escape($_) }

$pattern = $terms -join '|'

文件中的每个术语都应位于单独的行中,没有前导或尾随通配符。像这样:

结束程序 开始

这样您可以检查文件夹中的文件是否不包含以下任何术语:

Get-ChildItem $folder | Where-Object {
    -not $_.PSIsContainer -and
    (Get-Content $_.FullName | Select-Object -Last 1) -notmatch $pattern
}

如果您想检查整个文件而不是只检查最后一行的更改

Get-Content $_.FullName | Select-Object -Last 1

Get-Content $_.FullName | Out-String

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2019-10-11
    • 2014-12-01
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多