PowerShell比较文本文件的两个方法_PowerShell

需求:比较两个文本文件,不相等时输出行号和列号,和开始不相等的字符。

方法一:Compare-Object

利用PowerShell命令Compare-Object,非常值得学习。

复制代码 代码如下:

function Compare-Files{
 param(
 $file1,
 $file2,
 [switch]$IncludeEqual
 )
 $content1 = Get-Content $file1
 $content2 = Get-Content $file2
 $comparedLines = Compare-Object $content1 $content2 -IncludeEqual:$IncludeEqual |
 group { $_.InputObject.ReadCount } | sort Name
 $comparedLines | foreach {
 $curr=$_
 switch ($_.Group[0].SideIndicator){
“==” { $right=$left = $curr.Group[0].InputObject;break}
“=>” { $right,$left = $curr.Group[0].InputObject,$curr.Group[1].InputObject;break }
“<=" { $right,$left = $curr.Group[1].InputObject,$curr.Group[0].InputObject;break }
 }
 [PSCustomObject] @{
 Line = $_.Name
 Left = $left
 Right = $right
 }
 }
 }

方法二,使用流处理比较

解释:没有使用内置的string相等比较,而是定义了函数 Diff-String,可以返回字符串首次不相等时的索引。

复制代码 代码如下:

function Diff-Txt([io.fileinfo]$firstFile,[io.fileinfo]$secondFile)
{
    #参数判断
    if( -not $firstFile.Exists)
    {
        throw "$firstFile 不存在"
    }
    if( -not $secondFile.Exists)
    {
        throw "$secondFile 不存在"
    }
    $sr1=[IO.StreamReader]$firstFile.FullName
    $sr2=[IO.StreamReader]$secondFile.FullName

    #内部函数:比较字符串
    #返回-1表示相等,返回其它表示从$str1开始不等的索引
    function Diff-String([string]$str1,[string]$str2)
    {
        for( $i=0; $i -lt $str1.Length; $i++)
        {
            if($i -lt $str2.Length)
            {
                if($str1[$i] -cne $str2[$i]){ return $i }
            }
            else { return $i }
        }
        if($str2.Length -gt $i ) { return $i }
        return -1
    }

    # firstFile 没到文件末尾
    $line=1
    while(-not $sr1.EndOfStream)
    {
        $str1 = $sr1.ReadLine()

        # secondFile 到了文件末尾
        if($sr2.EndOfStream)
        {
            Write-Host "=> [$line 行,1 列]"
        }

        # secondFile 没到文件末尾
        else
        {
            $str2 = $sr2.ReadLine()
            $result = Diff-String -str1 $str1 -str2 $str2
            if($result -ne -1)
            {
                Write-Host "<> [$line 行,$result 列] 字符->" -NoNewline
                Write-Host  $str1[$result]   -ForegroundColor red
            }
        }

        $line++
    }
    # 第二个文件没到文件末尾
    while( -not $sr2.EndOfStream)
    {
        $str2 = $sr2.ReadLine()
        Write-Host "<= [$line 行,1 列]"
    }
    # 关闭文件流
    $sr1.Close()
    $sr2.Close()
}

测试用例一

输入

第一个文件内容为:

复制代码 代码如下:

PowerShell
中文博客
jb51.net

荔非苔
第二个文件内容为:

复制代码 代码如下:

PowerShell
中文播客
jb51.Net
荔非苔
Mosser Lee

输出:

 

测试用例二

输入

第一个文件内容为:

复制代码 代码如下:

玉树临风
马上伊利
文章做作

第二个文件内容为:

复制代码 代码如下:

玉树临疯

输出:

文章出处:http://www.pstips.net/

时间: 2024-09-13 19:09:26

PowerShell比较文本文件的两个方法_PowerShell的相关文章

Flash中调用外部文本文件的两种方法

方法一:利用上下滚动按钮 1.打开文本文件,将文本复制到Windows 2000自带的程序"记事本"中,并在文本内容的前面输入"t="("t"为我们定义的一个变量),然后保存为"m.txt"文件,保存位置为"我的文档",编码设为"UTF-8"或"Unicode". 2.运行Flash MX,以"也谈在Flash中调用外部文本文件"为名,保存在&qu

Powershell中阻止”确认提示”的方法_PowerShell

适用于所有版本. 某些命令在执行时会自动提示用户再次确认,这可能会带来一些问题在无人执行脚本的时候. 要阻止弹出确认提示,需要设置-Confirm为false,如: 复制代码 代码如下: Remove-ADGroupMember -Identity 'Domain Admins' -Members user12 -Confirm:$false 或者你可以改变Powershell中的确认安全等级,将所有命令的确认提示关闭: 复制代码 代码如下: $ConfirmPreference = 'None

PowerShell Out-File指定文件编码的方法_PowerShell

本文介绍使用PowerShell如何来创建一个文本文件,并且文本文件是使用UTF-8编码的. 要创建一个UTF-8编码的文件,不是一件容易的事情.想一想C#中创建一个UTF-8编码的文件洪哥就头疼. 后来,仔细想了一下,我们可以把这个概念偷换一下.我们可以使用Out-File这个cmdlet来输入字符串到一文件的方式来创建一个文件,并且在创建文件时,指定它的编码为UTF-8即可. 也就是说,使用如下命令我们就可以得到一个UTF-8编码的空文件了. 复制代码 代码如下: PS C:\Users\s

PowerShell计算脚本执行时间的实现方法_PowerShell

另一个方法是设置两个时间快照和结束时间,计算它们的时差.这将告诉你Get-Hotfix执行了多久,得到的输出数据里将包含脚本执行的时间: 复制代码 代码如下: $start = Get-DateGet-HotFix$end = Get-DateWrite-Host -ForegroundColor Red ('Total Runtime: ' + ($end - $start).TotalSeconds) 文章出处:http://www.pstips.net/

PowerShell查看Windows功能选项的方法_PowerShell

在Windows Server 2012中使用PowerShell添加和删除Windows角色和功能非常方便,但是在windows 8.1上启用和禁用Windows选项却略显鸡肋. 比如Get-WindowsOptionalFeature获取当前所有的Windows功能选项: 复制代码 代码如下: PS> Get-WindowsOptionalFeature -Online | select * -First 1 FeatureName      : Microsoft-Hyper-V-All

PowerShell显示隐藏文件和系统文件的方法_PowerShell

在PowerShell中,列出文件的cmdlet是Get-ChildItem,别名为dir.比如我们使用"dir $env:windir"可以显示Windows目录的文件和文件夹. 命令: 复制代码 代码如下: PS >dir $env:windir 输出: 复制代码 代码如下: 目录: C:\Windows Mode                LastWriteTime     Length Name ----                -------------   

PowerShell复制命令行历史命令方法_PowerShell

适用于所有PowerShell版本 要保存你在当前PowerShell控制台上输入的所有的PowerShell命令,试试下面的代码: 复制代码 代码如下: (Get-History).CommandLine | clip.exe 它会复制所有的命令道剪贴板,然后你可以把它复制进PowerShell ISE,再保存.

PowerShell Out-File禁止覆盖文件的方法_PowerShell

本文介绍使用PowerShell来写文件时,如何阻止系统自动覆盖已有的文件. 我们在使用脚本进行文件处理的时候,我们可能不希望使用Ou-File生成的文件覆盖已有的文件.那么怎么实现呢?在Out-File这个CmdLet中,有没有什么参数可以阻止Out-File不声不响的覆盖了已有的文件呢? 答案是-NoClobber参数. NoClobber参数 在Out-File输出到文件时,如果使用了-NoClobber参数,则系统遇到已有文件时,将无法执行成功.下面的例子展示了当d:\1.txt已经存在

PowerShell读取文本文件指定行内容的方法_PowerShell

本文介绍一个PowerShell中如何一步到位的获取到一个文本文件的第N行.比如一个文本文件,它有1000行,我想把第500行的内容直接取出来的,最简单的方法是通过PowerShell来实现. 在PowerShell中,可以通过Get-Content这个cmdlet来获取文本文件的内容.Get-Content将一个文本文件读取到一个数组中,每一个数组元素就是文件的一行内容.比如一个文本文件内容如下: 复制代码 代码如下: 111 222 333 那么,使用Get-Content获取到一个数组,数