将相对路径传递给Powershell shell.application命名空间

时间:2018-03-14 13:45:37

标签: powershell zip

我试图从此页面获取该功能: https://www.howtogeek.com/tips/how-to-extract-zip-files-using-powershell/使用相对参数工作。

所以我有这个功能:

function Expand-ZIPFile($file, $destination)
{
    Write-Host "Unzipping $file to $destination" -ForegroundColor Yellow
    $shell = new-object -com shell.application
    $zip = $shell.NameSpace($file)
    foreach($item in $zip.items())
    {
        $shell.Namespace($destination).copyhere($item)
    }
}

我尝试这样称呼它:

$zipPath = Resolve-Path ".\myZip.zip"
$destinationPath = Resolve-Path ".\"
Expand-ZIPFile -File $zipPath -Destination $destinationPath

输出明智我看到了:

Unzipping D:\test\myZip.zip to D:\test
You cannot call a method on a null-valued expression.
At D:\test\Unzip.ps1:14 char:22
+     foreach($item in $zip.items())
+                      ~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

我假设是因为namespace没有被正确解释,因为如果我打电话:

Expand-ZIPFile -File "D:\test\myZip.zip" -Destination "D:\test"

这很好用,我明白了:

Unzipping D:\test\myZip.zip to D:\test

在控制台中也是如此。

我如何传递已解决的'字符串,因为我无法看到这里缺少的东西。

我还尝试在"中包装已解析的字符串,看看是否有所不同($zipPath = '"' + $zipPath + '"'),但无济于事。

1 个答案:

答案 0 :(得分:0)

我认为您的问题来自Resolve-Path。它返回一个带有path属性的对象,应该是一个直字符串。我原以为你的write-host行的控制台输出看起来很奇怪,但看起来它有一个很好的ToString()重载。

您需要扩展该属性。

$zipPath = (Resolve-Path ".\myZip.zip").Path
$destinationPath = (Resolve-Path ".\").Path
Expand-ZIPFile -File $zipPath -Destination $destinationPath

当您将Resolve-Path输出到标准输出时,您可以看到需要这样做。

resolve-path .\sql.txt

Path                     
----                     
C:\Users\myusername\sql.txt