嗯我用这个挣扎了足够长的时间。我有一个项目来比较两个文件夹,两个服务器各一个。我们将源服务器上的文件与目标服务器上的文件进行比较,并在目标服务器上完成更新后创建源中需要刷新的文件列表。
这是我的脚本(非常感谢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
< - 返回上述异常。
为什么?
答案 0 :(得分:7)
这给出了你没有Microsoft.PowerShell.Core\FileSystem::
的路径:
(Resolve-Path $file).ProviderPath
无需使用字符串替换。
答案 1 :(得分:1)
OpenRead
支持UNC路径。 Resolve-Path
会返回一个对象。使用(Resolve-Path MyFile.txt).Path.Replace('Microsoft.PowerShell.Core\FileSystem::', '')
作为OpenRead
的参数。使用UNC路径时从Resolve-Path
返回的路径包括PowerShell的完全限定模式,该模式包含OpenRead
方法不支持的标头,因此需要将其省略。
答案 2 :(得分:1)
使用Convert-Path
cmdlet,它将为您提供“常规”UNC表单中的路径。这在您使用任何shell命令时都需要,或者需要将整个路径传递给.Net方法等...
请参阅https://technet.microsoft.com/en-us/library/ee156816.aspx