我正在尝试创建一个从 Java 调用的 vbscript 来解压缩文件,然后使用解压缩的文件。我需要在提升模式下运行解压缩。当我这样做时,vbscript 在返回之前不会等待文件解压缩,并且下一个命令会在文件存在之前运行。
这是我目前正在做的事情:
爪哇:
public void unzipElevated( String fileName, String Target )
{
String unzipFile = "cscript "
+ tmpDir.getAbsoluteFile() + File.separator + "RunElevated.vbs "
+ "UnzipFiles.vbs "
+ fileName + " "
+ Target + File.separator;
ArrayList<String> lines = new ArrayList<String>();
Process p;
try
{
p = Runtime.getRuntime().exec( unzipFile );
p.waitFor();
InputStream s = p.getInputStream();
Scanner i = new Scanner( s );
while (i.hasNextLine())
lines.add( i.nextLine() );
}
catch (Exception e)
{
}
}
vbscript: (RunElevated.vbs)
' Run the script in elevated mode
'
' This will be needed to install programs into Program Files
prgName = Wscript.Arguments.Item(0)
prgArgs = ""
If Wscript.Arguments.Count > 1 Then
For i = 1 To Wscript.Arguments.Count - 1
prgArgs = prgArgs & " " & Wscript.Arguments.Item(i)
Next
End If
Set objShell = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
strPath = fso.GetParentFolderName (WScript.ScriptFullName)
If fso.FileExists(strPath & "\" & prgName) Then
prgCmd = Chr(34) & strPath & "\" & prgName & Chr(34)
If prgArgs <> "" Then
prgCmd = prgCmd & " " & prgArgs
End If
objShell.ShellExecute "wscript.exe", prgCmd, "", "runas", 1
Else
Wscript.Echo "Script file not found"
End If
vbscript:(解压缩文件.vbs)
' unzip a file- for now assume that full paths will be provided
ZipFile = Wscript.Arguments.Item(0)
Extract = Wscript.Arguments.Item(1)
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists( ZipFile ) Then
' If the extraction location does not exist create it.
If NOT fso.FolderExists( Extract ) Then
fso.CreateFolder( Extract )
End If
' Do the extraction
set objShell = CreateObject( "Shell.Application" )
set FilesInZip = objShell.NameSpace( ZipFile ).items
objShell.NameSpace( Extract ).CopyHere FilesInZip, 16
Set objShell = Nothing
Else
Wscript.echo "Zip file not found"
End If
Set fso = Nothing
我在 RunElevated 中使用 wscript 是因为我想查看 uzip 命令的进度框,而不是 cmd 窗口。我在 CopyHere 中使用 16 来不提示覆盖文件。
它工作得很好,除了它会在压缩开始后立即返回,这会使尝试使用解压缩的文件变得一团糟。
我找到了运行命令,它有一个等待进程完成的选项:
Set objShell = Wscript.CreateObject("WScript.Shell")
objShell.Run "TestScript.vbs" intWindowStyle, bWaitOnReturn
我认为这将允许我(将 bWaitOnReturn 设置为 true)让 vbscript 等到调用的脚本完成,但我看不到如何使用 Run 在提升模式下运行。
我一直在寻找,但我还没有找到一种方法来运行提升并等待该过程完成。这似乎是一个非常普遍的要求(无论何时复制、解压缩等)。我是vbscript新手,要么没找到答案,要么看的时候没认出来。
一些 vbscript 大师可以在这里帮助我吗?或者,如果我的 Java 出错了,我也很乐意在那里获得帮助!