/* ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ QZA:感谢群友卢霖的多文件传参正则以及系统位数判断的dllcall 1、如果选中一个文件,则以文件名作为生成压缩包的文件名 2、如果选中多个文件,则以上层目录的目录名作为生成压缩包的文件名 3、如果选中的有且仅有一个文件夹,则以文件夹名,作为生成压缩包的文件名 4、如果遇到同名的压缩包则以文件名+(数字)这种来命名 5、智能的解释就是压缩包里不会出现文件夹嵌套的问题,类似于智能解压可以自动的去掉文件夹嵌套,具体不会表述,自行测试即可 6、总之一切功能都有智能解压的影子 7、有问题可以交流 run:1324424600 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ cando_智能压缩: global 7zip global dir ThisProcess := DllCall("GetCurrentProcess") ;判断系统是多少位 感谢卢霖 if !DllCall("IsWow64Process", "uint", ThisProcess, "int*", IsWow64Process) IsWow64Process := false if %IsWow64Process%=0 ;如果系统是32位 7zip:= "Apps7-Zip327zG.exe" else 7zip:= "Apps7-Zip647zG.exe" if !InStr(candysel,"`n") ;若不是多文件则执行下列命令,以所选文件为压缩文件名 { if InStr(FileExist(candysel), "D") ;若为文件夹则执行下来命令 { SplitPath, candysel, name, dir, ext, name_no_ext, Drive Loop, %candysel%* ,1 ;1表示获取文件夹文件夹. { if A_Index=1 { File=% A_LoopFileFullPath continue } File.= "`r" . "`n" . A_LoopFileFullPath } FileList := RegExReplace(File, "rn", """ """) ;感谢卢霖 name_cheack(name,FileList) ; Run %7zip% a "%dir%""%name%.7z" "%FileList%" return } else { SplitPath, candysel, name2, dir, ext, name_no_ext, Drive ; Run %7zip% a "%dir%%name_no_ext%" "%candysel%" name_cheack(name_no_ext,candysel) return } } RegExMatch(candysel,"((?!\)[^\]+(?=\[^\]+n?$))",m) ;获取上一级目录的文件名 Loop,Parse,candysel,`n,`r ;若为多文件,则执行下列命令,以上一级文件名为压缩文件名 { SplitPath, A_LoopField, name2, dir, ext, name_no_ext, Drive if A_Index=1 { File=% A_LoopField continue } File.= "`r" . "`n" . A_LoopField ;~ FileList.=A_LoopField . """ """ } ;~ MsgBox %FileList% FileList := RegExReplace(File, "rn", """ """) Clipboard=%FileList% ; Run %7zip% a "%dir%%m1%" "%FileList%" name_cheack(m1,FileList) return name_cheack(name,files){ ;name_cheack: IfExist,%dir%%name%.7z ;已经存在了以“首层文件夹命名”的文件夹,怎么办? { ; MsgBox %7zip% Loop { FolderName=%dir%%name%( %A_Index% ).7z If !FileExist( FolderName ) { MsgBox %FolderName% Run %7zip% a "%FolderName%" "%files%" break } } return } ; MsgBox %name% Run %7zip% a "%dir%%name%.7z" "%files%" }