Powershell - 循环问题

时间:2012-02-16 19:07:39

标签: powershell

首先,我想为目录中的所有文本文件生成目录列表。接下来将获取每个文本文件和获取内容。然后我想浏览内容并搜索与第一个文件共享内容的另一个目录中的所有文本文件,并将这些相应的匹配输出到源文件后面的文件。

我对这一切都很陌生,并意识到我错过了一些严肃的基本知识块。我所拥有的小脚本体验是在Javascript中,它似乎并不完全可转移。 (虽然编程是编程我告诉过。)

这是我到目前为止所做的:

$max = get-content h:test1\one.txt | Measure-Object
$A = get-content h:test1\one.txt
For($i=0; $i -lt $max.count ; $i++){
    select-string h:test2\*.txt -pattern $($A[$i]) | Format-Table | Out-File ($i + '.txt')
    }

我希望有类似的东西:

$max = get-content $files[i] | Measure-Object
    $A = get-content files[i]
    For($j=0; $j -lt $max.count ; $j++){
        select-string h:test2\*.txt -pattern $($A[$j]) | Format-Table | Out-File($files[i].basename + $j + '.txt')
    }

非常感谢任何和所有帮助,

裴家

所以

第1册(one.txt)

法国首都是巴黎 巴黎的人口是十二。

第2册(two.txt)

法国是一个美丽的国家 法国首都是巴黎。

我基本上想要报告一个事实,即two.txt与one.txt共享一行。

2 个答案:

答案 0 :(得分:5)

  

首先,我想为目录

中的所有文本文件生成目录列表

以下是:

$textFiles1 = dir -Path C:\Books1 -Filter *.txt
$textFiles2 = dir -Path C:\Books2 -Filter *.txt
  
      
  1. 接下来将获取每个文本文件和获取内容。
  2.   
  3. 我想看看第一本书中的任何一行是否出现在其他任何一本书中。
  4.   

这是一个执行此操作的算法(未经测试)(已测试):

foreach ($textFile in $textFiles1) {
    $lines = get-content -Path $textFile
    foreach ($line in $lines) {
        foreach ($textFile2 in $textFiles2) {
            $lines2 = get-content -Path $textFile2 
            if ($lines2 -contains $line) {
                $matchMessage = 'Line: "{0}" is duplicated in "{1}".' -f $line, $textFile2
                $matchMessage | out-file C:\report.txt -encoding UTF8 -Append
            }
        }
    } 
}

notepad C:\report.txt

答案 1 :(得分:2)

好的,让我们打破这个:

  

首先,我想为目录中的所有文本文件生成目录列表。接下来,每个文本文件和获取内容。

dir *.txt | get-content
  

然后我想浏览内容并搜索所有文本文件   在另一个目录中与第一个文件共享内容

好的,现在我们将所有文字都传输到select-string(首先用?{$_}过滤掉所有空字符串:

dir *.txt | get-content | ?{$_} | %{select-string -path searchPath\*.txt -pattern "$_" -simple}
  

并将相应的匹配输出到以。命名的文件   源文件。

所以现在它变得棘手,因为我们必须返回并跟踪我们的源文件名,我们通过在foreach(即%{})中包装我们的查询来实现这一点:

dir *.txt | %{ $sourceFile = $_; get-content $_ | ?{$_} | %{select-string -path searchPath\*.txt -pattern "$_" -simple} | out-file "$sourceFile.results" }