3

好吧,我已经为这个挣扎了足够长的时间。我有一个项目来比较两个文件夹,两台服务器各有一个。我们将源服务器上的文件与目标服务器上的文件进行比较,并将创建一个源文件列表,一旦目标服务器上的更新完成,就需要刷新这些文件。

这是我的脚本(非常感谢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两台服务器之间的路径运行它时,我得到

使用“1”参数调用“OpenRead”的异常:“不支持给定路径的格式。”

对此的任何帮助将不胜感激。最终结果应该是文件列表,但由于某种原因它不喜欢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 <-- 返回上述异常。

为什么?

4

3 回答 3

7

这给出了您在没有以下情况下的路径Microsoft.PowerShell.Core\FileSystem::

(Resolve-Path $file).ProviderPath

无需使用字符串替换。

于 2013-04-23T23:30:34.063 回答
1

OpenRead支持 UNC 路径。Resolve-Path返回一个对象。用作(Resolve-Path MyFile.txt).Path.Replace('Microsoft.PowerShell.Core\FileSystem::', '')的参数OpenRead。使用 UNC 路径时返回的Resolve-Path路径包括 PowerShell 的完全限定架构,其中包含该OpenRead方法不支持的标头,因此需要将其省略。

于 2012-05-18T17:14:28.447 回答
1

使用Convert-Pathcmdlet,它将为您提供“常规”UNC 格式的路径。每当您使用任何 shell 命令或需要将整个路径传递给 .Net 方法等时,都需要这样做...

请参阅https://technet.microsoft.com/en-us/library/ee156816.aspx

于 2015-11-17T08:51:30.523 回答