找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 3813|回复: 6

[问题求助] [已解决]为什么shell.application解压文件用NameSpace方法获取存在的文件返回nothing

[复制链接]
发表于 2025-7-18 22:19:30 | 显示全部楼层 |阅读模式
本帖最后由 LTSC1809 于 2025-7-20 13:57 编辑
  1. Dim oShApp,oSourceFile,oItem,oTarget,oArgs,nOptions,oFs,sLibTemp
  2. Randomize
  3. sLibTemp="CLauncherTemp_"&CStr(Int(10*Rnd()))&CStr(Int(10*Rnd()))&CStr(Int(10*Rnd()))
  4. Set oArgs=WScript.Arguments
  5. Set oFs=CreateObject("Scripting.FileSystemObject")
  6. oFs.MoveFile oArgs.Item(0),oArgs.Item(0)&".zip"
  7. Set oShApp=CreateObject("Shell.Application")
  8. If oFs.FolderExists(oArgs.Item(1))=False Then oFs.CreateFolder(oArgs.Item(1))
  9. Do While(oFs.FolderExists(sLibTemp)=True)
  10.         sLibTemp="CLauncherTemp_"&CStr(Int(10*Rnd()))&CStr(Int(10*Rnd()))&CStr(Int(10*Rnd()))
  11. Loop
  12. Set oSourceFile=oShApp.NameSpace(oArgs.Item(0)&".zip")
  13. Set oItem=oSourceFile.Items()
  14. oFs.CreateFolder(sLibTemp)
  15. Set oTarget=oShApp.NameSpace(sLibTemp)
  16. nOptions=256
  17. oTarget.CopyHere oItem,nOptions
  18. oFs.MoveFile oArgs.Item(0)&".zip",oArgs.Item(0)
  19. oFs.CopyFile sLibTemp&"\*.dll",oArgs.Item(1),True
  20. oFs.DeleteFolder(sLibTemp)
复制代码
如上代码用于把传入的第一个参数(一个jar文件)解压到指定文件夹(第二个参数指定文件夹)。Shell.Application解压文件的方法我是从网上抄的。由于它只支持后缀是.zip的文件,jar虽然也是zip格式但是它不认,所以先把源文件jar加上.zip,解压完毕再改回来。由于直接解压到目标文件夹如果已经存在会弹窗询问是否替换,所以创建临时文件夹,把文件解压到临时文件夹,再复制到目标文件夹,设置替换,就不会弹窗询问是否替换了。由于需要这个脚本同时启动多个进程解压不同文件,因此创建一个目前不存在的随机数临时文件夹。现在的问题是,我一开始采用直接解压到目标文件夹的方式时,工作正常,现在加入了临时文件夹却会在Set oItem=oSourceFile.Items()这里报错提示缺少对象。使用vbsedit调试发现这里oSourceFile为Nothing。明明这个文件(oArgs.Item(0)&".zip"已经存在了,我在这里用oFs.FileExist检查也确实提示文件已经存在了,但是NameSpace方法还是返回Nothing?麻烦大佬们帮忙看看,谢谢!
发表于 2025-7-18 22:53:13 | 显示全部楼层
NameSpace方法参数是文件夹(字符串)
https://learn.microsoft.com/zh-c ... ell/shell-namespace
 楼主| 发表于 2025-7-18 23:05:22 | 显示全部楼层
回复 2# Five66


    好的,谢谢!顺便问问,用shell.application,怎么解压文件?这个文档中设置的是文件夹,那我怎么做才能解压zip文件?
发表于 2025-7-19 00:46:29 | 显示全部楼层
试试
zip文件用完整路径
oSourceFile和oTarge使用不同变量对应的shell.NameSpace

评分

参与人数 1技术 +1 收起 理由
LTSC1809 + 1 感谢

查看全部评分

发表于 2025-7-19 14:02:25 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-19 14:16 编辑

回复 1# LTSC1809

给一个 bat+jscript 示例代码(存为 test.bat 运行),说明采用 .copyHere 解压zip文件的基本方法
代码第2行自定义变量 zipF 指定压缩包文件(须为全路径文件名),自定义变量 zipD 指定解压文件的到达目录(须为全路径目录名);代码第7行采用 .copyHere 选项参数=20,即关闭进程报告和提示确认

  1. 2>1/* ::
  2. @echo off &setlocal &set "zipF=c:\abc\1.zip" &set "zipD=c:\xyz"
  3. cscript /nologo /e:jscript "%~f0" "%zipF%" "%zipD%"
  4. pause&exit/b */
  5. v=WSH.arguments, sa=WSH.createobject('shell.application')
  6. f=sa.namespace(v(0)), d=sa.namespace(v(1))
  7. d.copyhere(f.items(), 20), WSH.quit();
复制代码
用系统内置的 .copyHere 解压zip文件是一个比较古老的方法,限制较多且处理大数据时效率较低,远逊于那些著名的第三方解压工具,这也是后者能够日益普及的原因吧...

评分

参与人数 1技术 +1 收起 理由
LTSC1809 + 1 感谢

查看全部评分

 楼主| 发表于 2025-7-20 13:54:13 | 显示全部楼层
回复 5# aloha20200628

主要是我想把这个文件跟随一个程序发布,万一别人电脑上没有winrar或者7z之类呢,感谢了,已经解决了,我发现目标文件夹必须最后有个反斜杠才能行😃
 楼主| 发表于 2025-7-20 13:55:50 | 显示全部楼层
回复 4# Five66 感谢了,找到问题了,目标文件夹最后需要反斜杠,没有反斜杠就不行😄
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 04:28 , Processed in 0.021435 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表