我已经为此苦苦挣扎了很久。我有一个项目需要比较两个文件夹,一个在两个服务器上的每个文件夹中各有一个。我们将比较源服务器上的文件与目标服务器上的文件,并创建一个需要在目标服务器完成更新后刷新源文件的列表。
以下是我的脚本(非常感谢原作者http://quickanddirtyscripting.wordpress.com):
以下是我的脚本(非常感谢原作者http://quickanddirtyscripting.wordpress.com):
param ([string] $src,[string] $dst)
function get-DirHash()
{
begin
{
$ErrorActionPreference = "silentlycontinue"
}
process
{
dir -Recurse $_ | where { $_.PsIsContainer -eq $false -and ($_.Name -like "*.js" -or $_.Name -like "*.css"} | select Name,FullName,@{Name="SHA1 Hash"; Expression={get-hash $_.FullName -algorithm "sha1" }}
}
end
{
}
}
function get-hash
{
param([string] $file = $(throw 'a filename is required'),[string] $algorithm = 'sha256')
try
{
$fileStream = [system.io.file]::openread((resolve-path $file));
$hasher = [System.Security.Cryptography.HashAlgorithm]::create($algorithm);
$hash = $hasher.ComputeHash($fileStream);
$fileStream.Close();
}
catch
{
write-host $_
}
return $hash
}
Compare-Object $($src | get-DirHash) $($dst | get-DirHash) -property @("Name", "SHA1 Hash")
现在,如果我使用本地路径运行此命令,例如c:\temp\test1 c:\temp\test2
,则可以正常工作。但是,当我使用两台服务器之间的UNC
路径运行它时,我会收到以下异常消息:
Exception calling "OpenRead" with "1" argument(s): "The given path's format is not supported."
请指导一下。最终结果应该是文件列表,但由于某种原因它不喜欢UNC
路径。
脚本名称为compare_js_css.ps1
,调用方式如下:
.\compare_js_css.ps1 c:\temp\test1 c:\temp\test2
<-- 这个能工作
.\compare_js_css.ps1 \\\\devserver1\c$\websites\site1\website \\\\devserver2\c$\websites\site1\website
<-- 返回上述异常。
为什么?