powershell:调用7z,haozip解压缩文件_命令行 好压-程序员宅基地

技术标签: 解压缩  7z  powershell  haozip  script  

因为windows内置了zip格式文件的解压缩,所以powershell中可以直接调用powershell的函数就能实现zip解压缩.

利用powershell内置功能实现zip解压缩的代码如下:

# 调用powershell内置功能解压缩 $package 指定的 zip 文件到 $targetFolder
# 如果 $targetFolder为空则默认解压到 $package所在文件夹
function unzip([string]$zipFile,[string]$targetFolder){
    
    # 检查是否为zip后缀
    if ( Test-Path -Path $zipFile -PathType Leaf){
    
	    echo "not found:$zipFile "
	    exit -1
    }
    if(!$zipFile.ToLower().EndsWith(".zip")){
    
        echo "$zipFile not zip file"
        exit -1
    }
    # targetFolder为空时解压到zipFile同级文件夹的同名文件夹
    if(! $targetFolder){
    
        $targetFolder=(Get-Item $zipFile).Directory
    }    
    $shellApp = New-Object -ComObject Shell.Application
    $files = $shellApp.NameSpace($zipFile).Items()
	echo "unzip to $targetFolder..."    
    $shellApp.NameSpace($targetFolder).CopyHere($files)
}

但是在powershell下对其他的压缩格式(.7z,.tar,.gz,.rar…)就需要调用第三方工具来实现。
7z和HaoZip(好压)都提供了命令行解压缩工具,所以可以利用7z或HaoZip来实现
利用7z和HaoZip(好压)实现命令行解压的powershell实现代码如下:
unpack.ps1

[CmdletBinding()]
param(
#[Parameter(Mandatory=$true,HelpMessage="输入要解压的压缩包名称(.zip,.gz...)")]
[string]$package,
[string]$targetFolder,
[switch]$quiet,
[switch]$help
)
# 上一条命令执行出错则中止脚本执行,并输出调用堆栈信息
function exit_on_error(){
    
	if ( ! $? ){
    
		echo "exit for error:$1 " 
		exit -1
	}
}
# 调用 haozip解压文件
function unpack_haozip([string]$exe,[string]$package,[string]$targetFolder){
    
    $item=Get-Item $exe    
    $unpack_exe=Join-Path -Path $item.Directory -ChildPath ('HaoZipC'+$item.Extension)
    
    $cmd="""$unpack_exe"" x $package -o$targetFolder -y"
    if( $quiet ){
    
        # -sn:禁止文字输出
        $cmd+=' -sn'
    }    
    cmd /c $cmd
    exit_on_error    
}
# 调用 7z解压文件
function unpack_7z([string]$exe,[string]$package,[string]$targetFolder){
    
    $item=Get-Item $exe
    $unpack_exe=Join-Path -Path $item.Directory -ChildPath ('7z'+$item.Extension)
    $cmd="""$unpack_exe"" x $package -o$targetFolder -y"
    if(! $quiet){
    
        # -bb[0-3] : set output log level
        $cmd+=' -bb1'
    }   
    cmd /c $cmd
    exit_on_error
    if( $package.ToLower().EndsWith('.tar.gz')){
            
        $tar=Join-Path -Path $targetFolder -ChildPath (Get-Item $package).BaseName
        $cmd="""$unpack_exe"" x $tar -o$targetFolder -y"
        if(!$quiet){
    
            $cmd+=' -bb1'
        }   
        cmd /c $cmd
        exit_on_error
        del -Force -Recurse  $tar
        exit_on_error
    }
}

# 查看后缀为$suffix的文件的本机文件关联程序
function find_associated_exe([string]$suffix){
    
	$Extension,$FileType=(cmd /c assoc $suffix) -split '='
    if(!$FileType){
    
        Write-Host "请用手工指定 `$UNPACK_TOOL 变量指定解压缩软件,define `$UNPACK_TOOL to fix it"
        exit -1
    }    
    $FileType,$Executable= (cmd /c ftype $FileType) -split '='
    if( ! $Executable ){
    
        exit -1
    }
    # exe 全路径    
   ($Executable -replace '^([^"\s]+|"[^"]+?")(\s.+)?$','$1') -replace '(^"|"$)',''
}
# 为后缀为$suffix压缩包寻找解压缩工具
# 如果定义了 $UNPACK_TOOL 则优先使用它做为解压缩工具
# 否则 调用 assoc,ftype 来查找对应的解压缩工具,如果找不到就报错退出
function find_unpack_function([string]$suffix){
    
    if($UNPACK_TOOL){
            
        $exe=$UNPACK_TOOL
    }else{
    
        $exe=find_associated_exe $suffix
    }
    $fun="unpack_"+ ((Get-Item $exe).BaseName.toLower() -replace '^.*(7z|haozip).*$','$1')
    # 返回解压缩函数名 unpack_xxxx
    $fun
    # 返回解压缩工具软件的exe文件(全路径)
    $exe
}
# 解压缩 $package 指定的文件到 $targetFolder
# 如果 $targetFolder为空则默认解压到 $package所在文件夹
function unpack([string]$package,[string]$targetFolder){
    
    if(! $targetFolder){
    
        $targetFolder=(Get-Item $package).Directory
    }
    $index=$package.LastIndexOf('.')
    if($index -lt 0){
    
        # 没有文件后缀,无法识别,报错退出
        echo "unkonw file fomat $package"
        exit -1
    }
    if(!( Test-Path -Path $targetFolder -PathType Container)){
    
        mkdir $targetFolder
        exit_on_error
    }
    $suffix=$package.Substring($index) 
    #if ( $suffix -eq '.zip' ){
    
    #    unzip $package $targetFolder
    #}else{        
        $fun,$exe=find_unpack_function $suffix
        # 调用 unpack_xxxx(haozip|7z)解压
        &$fun $exe $package $targetFolder
    #}
}
# 指定命令解压工具
# 这里指定的exe,是支持命令行运行的版本,
# 比如7z的 GUI版本的可执行文件是 7zfm.exe,命令行版本则是7z.exe
# 好压(HaoZip)的GUI版本的可执行文件是 HaoZip.exe,命令行版本则是 HaoZipC.exe
# 如果不设置此值,脚本会通过 assoc,ftype命令查找,但有可能查找不到
#$UNPACK_TOOL="C:\Program Files\7-Zip\7z.exe"
#$UNPACK_TOOL="C:\Program Files\2345Soft\HaoZip\HaoZipC.exe"
# 运行过程中是否显示显示详细的进行步骤
# 输出帮助信息
function print_help(){
    
    echo "用法: $my_name [可选项...][压缩包文件]
PowerShell解压文件工具

选项:
    -p,-package      要解压的文件(.zip,.tar,.gz...)
	-q,-quiet        不显示详细信息
	-h,-help        显示帮助信息
作者: [email protected]
"
}
$my_name=$($(Get-Item $MyInvocation.MyCommand.Definition).Name)
if($help){
    
    print_help  
    exit 0
}
# 根据命令行参数对$package解压缩
unpack $package $targetFolder
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/10km/article/details/73435606

智能推荐

VS中添加lIb库及头文件(外部依赖项)的步骤_vs项目中依赖库的头文件-程序员宅基地

文章浏览阅读4.5k次。VS中添加LIb库及头文件(外部依赖项)的步骤:1、添加工程的头文件目录:工程—属性—配置属性—c/c+±–常规—附加包含目录:加上头文件存放目录。2、添加文件引用的lib静态库路径:工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。3、添加工程引用..._vs项目中依赖库的头文件

互动抽奖背后的随机性与算法实现-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏7次。背景抽奖,是一种典型的互动玩法形式。无论是大V的粉丝抽奖,还是活动会场的参与抽奖,这种起源于彩票开奖的互动玩法,同时兼顾了高期待感和低预期的特征,让活动在成本控制之余又能有惊喜和引爆点,这样的优势让其在各种运营场景中幻化万千,大行其道。在闲鱼各种互动场与营销活动中,抽奖自然也是一个相当高频使用的互动玩法。众所周知,越是经典的玩法,业务需求就越发别出机杼,在参与条件、开奖展示、奖品规则等各方面千变万..._随机中奖逻辑

HSV颜色相似度-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏8次。一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。H: 0 — 180S: 0 — 255V: 0 — 255此处把部分红色归为紫色范围:目前在计算机视觉领域存在着_hsv颜色相似度

cox回归模型python实现_生存分析Cox回归模型(比例风险模型)的spss操作实例-程序员宅基地

文章浏览阅读1.7k次。一、生存分析基本概念1、事件(Event)指研究中规定的生存研究的终点,在研究开始之前就已经制定好。根据研究性质的不同,事件可以是患者的死亡、疾病的复发、仪器的故障,也可以是下岗工人的再就业等等。2、生存时间(Survival time)指从某一起点到事件发生所经过的时间。生存是一个广义的概念,不仅仅指医学中的存活,也可以是机器出故障前的正常运行时间,或者下岗工人再就业前的待业时间等等。有的时候甚..._cox比例风险回归模型spss

git commit --amend_git commit --amend 之后还要push吗-程序员宅基地

文章浏览阅读144次。使用场景用于修改上次提交,可修改上次提交的commit message信息,也可修改commit 的内容用法上次commit 内容不满意,代码并未合并,需要有改动的地方:修改文件git addgit commit – amendgit push以上修改并不产生新的commit id但是如果修改文件git addgit commit “”git push此办法会产生新的commit id,合并的人需要将两次commit id合并..._git commit --amend 之后还要push吗

九度OJ-程序员宅基地

文章浏览阅读891次。1.1016这是一道简单题,主要要考虑到,比如说108,8,2这种类似的情况,其中8被认为是08,所以最后两位相同,输出-1。#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){char a[20], b[20], *p, *q;int k, a1, b1, len1, len2, a2, b2;while (scanf("%s%s%d", a, b, &a..._九度oj

随便推点

HTML5基于flash实现播放RTMP协议视频_网页使用flash播放rtsp-程序员宅基地

文章浏览阅读3.1w次,点赞6次,收藏28次。HTML5实现播放RTMP协议视频<!doctype html><html><head><meta charset="utf-8"><title>Video.js 7</title> <link href="css/video-js.min.css" rel="stylesheet"> <sty..._网页使用flash播放rtsp

Error opening data file Tesseract-OCR\tessdata/eng.traineddata问题 解决_error opening data file ./eng.traineddata-程序员宅基地

文章浏览阅读1.2w次,点赞23次,收藏19次。在安装完tesseract, pytesseract后执行测试命令,发现打印如下错误:Error opening data file \Program Files (x86)\Tesseract-OCR\tessdata/eng.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to the..._error opening data file ./eng.traineddata

杂项总结 vue sass less vue-router_vue使用less还是sass好-程序员宅基地

文章浏览阅读92次。// 通用修饰符 // stop 实现阻止冒泡的修饰符// prevent 实现阻止默认行为的修饰符// once 表示单次触发的修饰符// self 表示绑定事件的元素与触发事件的元素是同一个元素// 鼠标修饰符// left 鼠标点击左键// right 鼠标点击右键// middle 鼠标中间件// 辅助修饰符// ctrl 点击 ctrl 辅助键// shift 点击 shift 辅助键盘// alt 点击 alt 辅助键// meta_vue使用less还是sass好

html5 accept encoding,html - How to Specify a Vary: Accept-Encoding header? - Stack Overflow-程序员宅基地

文章浏览阅读79次。I found a helpful post to speed up wordpress website or blog https://www.keycdn.com/blog/speed-up-wordpress/With some other optimizations, I am also using below code on my site in .htaccess file (usua..._html5设置accept-encoding

在docker容器内 获取swarm节点IP_docker swarm 指定容器ip-程序员宅基地

文章浏览阅读566次。想在应用内获取当前swarm节点的IP使用.net 6框架 vs2022开发工具。_docker swarm 指定容器ip

国产的文档开发控件,spire.office新版本,一起来看看~_spire.office developer subscription(开发版本)-程序员宅基地

文章浏览阅读922次。Spire.Office 8.6.0更新已发布。在该版本中,Spire.PDF支持转换多页PDF文档为单个SVG文件;Spire.XLS新增了优化删除行的速度的方法;Spire.Presentation支持为TextFrame设置栏数。此外,许多已知问题也在该版本中被成功修复。_spire.office developer subscription(开发版本)

推荐文章

热门文章

相关标签