【发布时间】:2013-12-19 10:15:30
【问题描述】:
情况:
为了简单起见:我在一个网络共享上获得了多个快捷方式,这些快捷方式启动了一个连接到虚拟机控制台的 VMwareclient 应用程序。快捷方式如下所示:
\\share\vmware-vmrc.exe -h HOST -u USER -p PASS "[LocalStorage] NAME/NAME.vmx"
但我想知道是否有人已经在使用此控制台连接,因此我可以避免启动此快捷方式并选择另一台机器。所以我制作了一个脚本来执行此操作并将快捷方式更改为:
C:\Windows\System32\wscript.exe \\share\start.vbs NAME "[LocalStorage] NAME/NAME.vmx"
这会打开一个以静默方式运行批处理文件的 vbscript,因此用户看不到它。
arg = " " & WScript.Arguments.UnNamed(0) & " """ & WScript.Arguments.UnNamed(1) & """"
CreateObject("Wscript.Shell").Run "client.cmd" & arg ,0,False
这将打开运行 VMwareclient 启动并连接到给定虚拟机的 client.cmd,并写入日志文件以记录哪个用户正在使用虚拟机。
@echo off
pushd "%~dp0"
set TIMESTAMP=%TIME:~0,2%:%TIME:~3,2%
set CLIENT=%1
:start
IF EXIST logs\%client% goto msg
echo %username% since %TIMESTAMP% on %DATE% >logs\%client%
start /wait c:\vmwareclient\vmware-vmrc.exe -h HOST -u USER -p PASS %2
del logs\%client%
goto exit
:msg
for /f "delims=" %%x in ('type logs\%client%') do set "type=%%x"
echo wscript.quit MsgBox ("%client% is in use by %type%. Do you like to continue?", 4, "%client% is in use") > yesno.vbs
wscript //nologo yesno.vbs
set value=%errorlevel%
del yesno.vbs
if "%value%"=="6" start /wait c:\vmwareclient\vmware-vmrc.exe -h HOST -u USER -p PASS %2
if "%value%"=="7" goto exit
goto exit
:exit
popd
变量 %client% 包含快捷方式中给出的第一个参数,它代表 NAME。
这一切都很好。但是有一个问题,在“start /wait :..”处,脚本一直等到客户端应用程序关闭。但是,当用户注销或关闭 Windows 时,它会强制关闭脚本,并且不会继续执行脚本来删除日志文件。这会导致日志无关紧要,因为一些注销或强制关闭脚本的用户仍然存在于日志文件中,就好像虚拟机仍在使用中一样。
问题:
“start /wait”等到应用程序关闭,但当用户关闭窗口或注销时,脚本会被强制关闭并且不会继续。
问题:
是否有解决方案可以批量检测这种力关闭? (可能不是) 我需要切换到 VBscript 或其他程序/脚本语言来完成此操作吗?
【问题讨论】:
标签: vb.net windows batch-file vbscript forceclose