3

さて、私はこれで十分に長い間苦労してきました。2 つのサーバーのそれぞれに 1 つずつ、2 つのフォルダーを比較するプロジェクトがあります。ソース サーバーのファイルとターゲット サーバーのファイルを比較し、ターゲット サーバーでの更新が完了したら更新する必要があるソースのファイルのリストを作成します。

これが私のスクリプトです(元の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")

なんらかの理由で、これをローカルパスに対して実行すると正常に動作すると言いますが、2つのサーバー間のパス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

OpenReadUNC パスをサポートします。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-Pathコマンドレットを使用すると、「通常の」UNC 形式でパスが提供されます。これは、シェル コマンドを使用するとき、または .Net メソッドなどにパス全体を渡す必要があるときはいつでも必要になります。

https://technet.microsoft.com/en-us/library/ee156816.aspxを参照してください

于 2015-11-17T08:51:30.523 に答える