这是我的脚本(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表示"相对路径被解释为相对于当前工作目录。"
有什么问题?
答案 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视图。