当使用.NET ZipFile.CreateFromDirectory时,Powershell脚本使用用户的主目录作为当前工作目录。怎么修?

时间:2016-03-09 12:20:09

标签: powershell zip

这是我的脚本(createdistro.ps1)

Add-Type -assembly "system.io.compression.filesystem"

$source = "bin\Debug\"
$destination = "gwtester_signed.zip"

If(Test-path $destination) {Remove-item $destination}
[io.compression.zipfile]::CreateFromDirectory($source, $destination)

请注意我从运行脚本获得的错误消息:

PS C:\dev\DEV7\Test\gwtester> .\createdistro.ps1
Exception calling "CreateFromDirectory" with "2" argument(s): "The file 'C:\Users\bbren\gwtester_signed.zip' already
exists."
At C:\dev\DEV7\Test\gwtester\createdistro.ps1:7 char:1
+ [io.compression.zipfile]::CreateFromDirectory($source, $destination)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : IOException

如您所见,脚本尝试写入C:\Users\bbren\gwtester_signed.zip,但当前工作目录为C:\dev\etc\

documentation for ZipFile.CreateFromDirectory表示"相对路径被解释为相对于当前工作目录。"

有什么问题?

3 个答案:

答案 0 :(得分:2)

我不推荐$ PSScriptRoot。

试试这个:

$destination = Join-Path (Get-Location) 'gwtester_signed.zip'

但是根据你的psversion,Expand-Archive怎么样?

答案 1 :(得分:1)

$destination = "gwtester_signed.zip"更改为$destination = "$PSScriptRoot\gwtester_signed.zip"

答案 2 :(得分:0)

我实际上已将此添加到我的提示功能中,以保持.NET和Powershell视图显示当前工作目录的同步。可能有很多原因这是BadIdea™ - 但它对我有用:

[System.Environment]::CurrentDirectory = $PWD

当然,你可以在想要运行一个关心它的.NET方法之前调用它。

编辑:啊,是的,这个问题指出为什么这可能最终成为一个坏主意: Why don't .NET objects in PowerShell use the current directory?

Edit2:鉴于上述情况,我现在改变了我的提示功能:

if($PWD.Provider.Name -eq 'Filesystem'){
    [System.Environment]::CurrentDirectory = $PWD
}

因此,只有在当前的Powershell提供程序是Filesystem提供程序时,才会尝试更新当前目录的.NET视图。