【问题标题】:Two loops two files comparison - powershell两个循环两个文件比较 - powershell
【发布时间】:2014-06-02 17:44:26
【问题描述】:

在读取 2 个文件时尝试进行 2 个循环,目的是从第一个文件中获取 1 个值,将其与第二个文件中的 1,2,3rd.. 等值进行比较,然后返回外部循环,获取第 2 个值并进行比较依次到第二个文件中的所有值,依此类推。

问题是它只对第一个文件中的第一个值进行比较并停止。

代码:

Get-ExecutionPolicy
$main_list = [System.IO.File]::OpenText('c:\ping-workstations\main_list.txt')
$retired = [System.IO.File]::OpenText('c:\ping-workstations\retired.txt')

$main_i = 1
$retired_i = 1
[string]$main_list_line
[string]$retired_list_line

try
{
    while(!$main_list.EndOfStream)
    {   
        $main_list_line = $main_list.ReadLine()

        while(!$retired.EndOfStream)
        {   
            $retired_list_line =  $retired.readline()

            if($main_list_line -eq $retired_list_line)
            {
                write-host "`n`n`n match found for $main_list_line in main list `n`n`n`n"
                add-content "c:\ping-workstations\matches-through-text-files.txt" "$main_list_line`n"
            }   
            write-host "main iteration: $main_i / inside iteration: $retired_i`n - main value: $main_list_line ---- inside value: $retired_list_line`n`n"
            $retired_1++
        }
        $main_i++
    }
}
finally
{
    $main_list.close()
    $retired.close()
}

【问题讨论】:

  • 您到底想达到什么目标?如果您只需要查找匹配项,这很容易:$main_list = Get-Content 'c:\ping-workstations\main_list.txt'; $retired = Get-Content 'c:\ping-workstations\retired.txt'; foreach ($line in $main_list) { if ($retired -contains $line) { 'match found: {0}' -f $line } }
  • 它的列表很长,所以尽量避免使用 GC

标签: powershell


【解决方案1】:

在内循环结束后,您需要重新打开 $retired 文件。正如现在所写,一旦内部循环遍历 $retired 文件,$retired.EndOfStream 将永远保持为真。

try
{
    while(!$main_list.EndOfStream)
    {   
        $main_list_line = $main_list.ReadLine()

        while(!$retired.EndOfStream)
        {   
            $retired_list_line =  $retired.readline()

            if($main_list_line -eq $retired_list_line)
            {
                write-host "`n`n`n match found for $main_list_line in main list `n`n`n`n"
                add-content "c:\ping-workstations\matches-through-text-files.txt" "$main_list_line`n"
            }   
            write-host "main iteration: $main_i / inside iteration: $retired_i`n - main value: $main_list_line ---- inside value: $retired_list_line`n`n"
            $retired_1++
        }
        $main_i++
        $retired.close()
        $retired = [System.IO.File]::OpenText('c:\ping-workstations\retired.txt')
    }
}
finally
{
    $main_list.close()
    $retired.close()
}

附带说明一下,您是否考虑过使用 Powershell ISE?具有调试功能;通过设置断点并单步执行您的代码,我能够快速发现问题。

【讨论】:

  • 非常感谢,是的,经过无数次尝试,今天早上终于搞定了。从现在开始将使用 ISE。
猜你喜欢
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
相关资源
最近更新 更多