さて、私はこれで十分に長い間苦労してきました。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
<-- 前述の例外を返します。
なんで?