【问题标题】:How can this vbscript work properly with run command?这个 vbscript 如何与运行命令一起正常工作?
【发布时间】:2016-03-24 16:19:30
【问题描述】:

我想用批处理/vbs 解决方案压缩一些文件夹,如下所示:https://superuser.com/a/112094

这个工作,但原来的解决方案使用“睡眠”功能,我的档案有不同的文件大小,所以这不能正常工作。我的想法是使用 Run 命令(等待参数),但它失败了。

set FILETOZIP=C:\users\xyz\documents\folderOrfile
set TEMPDIR=C:\users\xyz\documents\temp
rmdir %TEMPDIR% /s /q
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs

echo theString = objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo objShell.Run theString, 1, true >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  C:\users\xyz\documents\someArchive.zip 

pause

错误信息如下:

对象不支持此属性或方法:objShell.Run

我怎样才能让脚本等到 zip 创建完成?

【问题讨论】:

    标签: windows command-line vbscript cmd zip


    【解决方案1】:

    您混淆了 Shell.ApplicationWScript.Shell 对象。只有后者有Run 方法。你得换行了

    echo objShell.Run theString, 1, true >> _zipIt.vbs
    

    echo CreateObject("WScript.Shell").Run theString, 1, true >> _zipIt.vbs
    

    话虽如此,尝试Run CopyHere 方法返回的内容对您毫无帮助。使用Shell.Application 压缩文件/文件夹的问题是,当(VB)脚本终止时,对象会自动销毁,从而中断未完成的复制操作。要么定义足够长的睡眠时间,要么wait in a loop

    【讨论】:

      【解决方案2】:

      除了错误,如果您想等到创建文件,请考虑查看 loopsIF EXIST

      这样的事情可能会奏效:

      :CHECKFILE
      IF EXIST C:\users\xyz\documents\someArchive.zip GOTO FOUNDFILE
      GOTO CHECKFILE
      
      :FOUNDFILE
      REM Do something with the file here
      

      【讨论】:

      • 这并不能解决问题。 VBScript 代码首先创建一个空的 zip 文件,因此不需要检查它是否存在。此外,手头的问题是执行压缩的 COM 对象异步运行,但在脚本执行时终止,因此如果此时尚未完成复制,则会中止。
      • 是的,你的回答很好地解决了他的代码问题(这就是我赞成它的原因),而我试图回答他的How can I achieve that the scripts wait till the zip is created? 的实际问题,尽管还有其他问题。跨度>
      • 我认为您误解了代码。所有echo 语句都会创建一个通过cscript _zipit.vbs ... 执行的VBScript。这个单一的 VBScript 既可以创建 zip 文件,也可以将文件复制到其中。在运行 VBScript 之前检查 zip 文件是否存在会创建一个无限循环。
      • 我明白你在说什么。我修改了FOUNDFILE 部分,以便我的答案与代码无关
      • 你还是不明白。整个 zip 处理 - 创建和复制 - 由 VBScript 完成。处理在执行 VBScript 时开始,并在 VBScript 终止时结束。所有这些都是批处理文件 (cscript _zipit.vbs ...) 中的一条语句,因此您无法在批处理代码中执行任何检查或循环操作。
      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多