2012-05-18 4 views
3

Ну, я так долго боролся с этим. У меня есть проект для сравнения двух папок, по одному на каждом из двух серверов. Мы сравниваем файлы на исходном сервере с серверами на целевом сервере и создадим список файлов из источника, которые необходимо обновить после завершения обновления на целевом сервере.Powershell UNC Path не поддерживается исключение

Вот мой сценарий (большое спасибо 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 призывающего «OpenRead» с «1» аргументом (ы): «формат данного путем не поддерживается.»

Любая помощь с этим была бы принята с благодарностью. Конечным результатом должен быть список файлов, но по какой-то причине ему не нравится путь 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 - возвращает вышеупомянутое исключение.

Почему?

ответ

1

OpenRead поддерживает пути UNC. Resolve-Path возвращает вам объект. Используйте (Resolve-Path MyFile.txt).Path.Replace('Microsoft.PowerShell.Core\FileSystem::', '') в качестве аргумента для OpenRead. Путь, возвращаемый с Resolve-Path при использовании путей UNC, включает полностью квалифицированную схему PowerShell, которая содержит заголовок, который не поддерживается методом OpenRead, поэтому его необходимо опустить.

+0

Хм ... все еще получают ту же ошибку. Я знаю, что это не проблема с разрешениями, так как у меня есть доступ администратора на обоих серверах. –

+0

@BobLyman Сделайте 'write-host (Resolve-Path $ file) .Path'. –

+0

Я получаю Microsoft.PowerShell.Core \ FileSystem :: \\ ltlymanb \ test1 \ style.min.css –

7

Это дает путь вы после без Microsoft.PowerShell.Core\FileSystem:::

(Resolve-Path $file).ProviderPath 

Нет необходимости использовать строку замены.

+0

Отлично работает, но зачем нам это нужно? – NealWalters

+0

Я рекомендую вам рассмотреть ответ @ piers7 ниже. –

1

Командлет Convert-Path, который предоставит вам путь в «обычной» форме UNC. Это будет необходимо в любое время использовать любые команды оболочки, или необходимо пройти весь путь к способу .Net и т.д. ...

См https://technet.microsoft.com/en-us/library/ee156816.aspx