Test-Path返回True,但ExtractToDirectory找不到路径。

3

我有一个简单的PowerShell脚本,旨在简化一些部署任务。

在脚本的早期部分,我创建了一个映射到远程服务器上Z:驱动器的虚拟驱动器。问题出现在它试图在映射到Z:的远程服务器上解压文件时。

function UnzipBuild($destinationFolder)
{    

    Add-Type -assembly "System.IO.Compression.Filesystem"    
    $zipFiles = Get-ChildItem -Path $destinationFolder -Filter *.zip
    foreach($zip in $zipFiles)
    {
        $folderName = $zip.ToString().TrimEnd(".zip")
        $extractPath = Join-Path $destinationFolder $folderName              

        New-Item -ItemType Directory $extractPath  
        Write-Host "Extracting $zip to $extractPath `r`n"                    
        [io.compression.zipfile]::ExtractToDirectory([string]$zip.FullName, "$extractPath")        
    }           
}

当执行到::ExtractToDirectory代码行时,会抛出异常。

Hit Line breakpoint on 'D:\MyDeploymentScript.ps1:85'
[DBG]: PS C:\WINDOWS\system32>> 
Exception calling "ExtractToDirectory" with "2" argument(s): "Could not find a part of the path 
'Z:\Build_11_17_13_28\Web'."
At D:\MyDeploymentScript.ps1:85 char:9
+         [io.compression.zipfile]::ExtractToDirectory([string]$zip.FullName, "$ex ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DirectoryNotFoundException

但是令人惊讶的是,如果我在同一位置设置断点并使用Test-Path检查路径,它会返回True。我现在不知道可能出了什么问题。

[DBG]: PS C:\WINDOWS\system32>> Test-Path Z:\Build_11_17_13_28\Web
True

2
当您映射 Z: 驱动器时,您是否使用了 New-PSDrive 命令?如果是,您是否使用了 -Persist 参数?如果没有,那么您调用的 .net 方法可能无法看到该驱动器。 - briantist
Test-path 仅确定路径是否存在,它不验证该路径是否为目录。Z:\Build_11_17_13_28\Web 是否确实为目录?您的脚本是否具有对该目录的写入权限?您还可以检查 $error[0].exception,以查看 InnerException 成员是否存在并具有值。 - Χpẘ
@briantist 很好的发现并添加了。奇怪的是,即使没有启用persist,我仍然可以在Debug时导航到Z:。 - tyh
@tyh 我已经添加了一个更详细的解释答案。 - briantist
1个回答

3
看起来您在脚本的早期部分可能是使用New-PSDrive映射驱动器。使用该命令时创建的驱动器仅在PowerShell中可见,除非您使用-Persist 开关。该开关将其创建为实际映射的驱动器(就像您使用了net use或组策略或通过资源管理器映射一样)。
您调用的.ExtractToDirectory方法无法看到任何powershell提供程序命名空间,因此需要一个真正映射到整个操作系统可见的驱动器或UNC路径。
请记住,如果您正在使用-Persist,您可能还想手动取消映射驱动器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接