全部,
有一个应用程序生成它的导出转储。我需要编写一个脚本,将前一天的转储与最新的转换进行比较,如果它们之间存在差异,我必须对移动和删除类型的东西进行一些基本的操作。
我试过找到一个合适的方法,我尝试的方法是:
$var_com=diff (get-content D:\local\prodexport2 -encoding Byte) (get-content D:\local\prodexport2 -encoding Byte)
我也尝试了Compare-Object cmdlet。我注意到内存使用率非常高,最终我在几分钟后收到消息System.OutOfMemoryException
。你有一个人做了一些similer吗?请一些想法。
有一个线程提到了一个比较,我不知道如何去做。
在此先感谢大家
OSP
答案 0 :(得分:15)
使用PowerShell 4,您可以使用本机命令行开关来执行此操作:
function CompareFiles {
param(
[string]$Filepath1,
[string]$Filepath2
)
if ((Get-FileHash $Filepath1).Hash -eq (Get-FileHash $Filepath2).Hash) {
Write-Host 'Files Match' -ForegroundColor Green
} else {
Write-Host 'Files do not match' -ForegroundColor Red
}
}
PS C:> CompareFiles。\ 20131104.csv。\ 20131104-copy.csv
文件匹配
PS C:> CompareFiles。\ 20131104.csv。\ 20131107.csv
文件不匹配
如果要以大规模编程方式使用此函数,可以轻松修改上述函数以返回$ true或$ false
看到这个答案之后,我只想提供更大规模的版本,只返回 true 或 false :
function CompareFiles
{
param
(
[parameter(
Mandatory = $true,
HelpMessage = "Specifies the 1st file to compare. Make sure it's an absolute path with the file name and its extension."
)]
[string]
$file1,
[parameter(
Mandatory = $true,
HelpMessage = "Specifies the 2nd file to compare. Make sure it's an absolute path with the file name and its extension."
)]
[string]
$file2
)
( Get-FileHash $file1 ).Hash -eq ( Get-FileHash $file2 ).Hash
}
答案 1 :(得分:10)
您可以使用fc.exe。它配备了Windows。以下是您将如何使用它:
fc.exe /b d:\local\prodexport2 d:\local\prodexport1 > $null
if (!$?) {
"The files are different"
}
答案 2 :(得分:7)
另一种方法是比较文件的MD5哈希值:
$Filepath1 = 'c:\testfiles\testfile.txt'
$Filepath2 = 'c:\testfiles\testfile1.txt'
$hashes =
foreach ($Filepath in $Filepath1,$Filepath2)
{
$MD5 = [Security.Cryptography.HashAlgorithm]::Create( "MD5" )
$stream = ([IO.StreamReader]"$Filepath").BaseStream
-join ($MD5.ComputeHash($stream) |
ForEach { "{0:x2}" -f $_ })
$stream.Close()
}
if ($hashes[0] -eq $hashes[1])
{'Files Match'}
答案 3 :(得分:6)
PowerShell的while back I wrote逐字节比较例程:
function FilesAreEqual
{
param([System.IO.FileInfo] $first, [System.IO.FileInfo] $second)
$BYTES_TO_READ = 32768;
if ($first.Length -ne $second.Length)
{
return $false;
}
$iterations = [Math]::Ceiling($first.Length / $BYTES_TO_READ);
$fs1 = $first.OpenRead();
$fs2 = $second.OpenRead();
$one = New-Object byte[] $BYTES_TO_READ;
$two = New-Object byte[] $BYTES_TO_READ;
for ($i = 0; $i -lt $iterations; $i = $i + 1)
{
$fs1.Read($one, 0, $BYTES_TO_READ) | out-null;
$fs2.Read($two, 0, $BYTES_TO_READ) | out-null;
if ([BitConverter]::ToInt64($one, 0) -ne
[BitConverter]::ToInt64($two, 0))
{
$fs1.Close();
$fs2.Close();
return $false;
}
}
$fs1.Close();
$fs2.Close();
return $true;
}
您可以通过以下方式使用它:
FilesAreEqual c:\temp\test.html c:\temp\test.html
哈希(如MD5)需要遍历整个文件才能进行哈希计算。该脚本会在看到差异时立即返回。它也进行了比较而没有计算,所以它应该减少对系统的压力。
答案 4 :(得分:0)
if ( (Get-FileHash c:\testfiles\testfile1.txt).Hash -eq (Get-FileHash c:\testfiles\testfile2.txt).Hash ) {
Write-Output "Files match"
} else {
Write-Output "Files do not match"
}