我试图从此页面获取该功能: 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 + '"'
),但无济于事。
答案 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