在vbscript文件中运行批处理CODE

时间:2015-12-28 20:13:19

标签: windows batch-file vbscript cmd

我正在尝试创建一个可以运行批处理代码的vbscript文件(注意:不是批处理文件,而是批处理代码)

代码,在批处理文件中运行:

IF EXIST "%appdata%\Microsoft\Windows\Start Menu\Programs\MyManufacturer\MyClickOnceApp.appref-ms" ( 
"%appdata%\Microsoft\Windows\Start Menu\Programs\MyManufacturer\MyClickOnceApp.appref-ms" 
) ELSE (start /b "" cmd /c del "%~f0"&exit /b)

我可以使vbscript代码几乎完成我想要的操作:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "C:\myscript.bat" & Chr(34), 0
Set WshShell = Nothing

现在我想将这两段代码合并到一个文件中,这样就可以了:

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Exec "IF EXIST ""%appdata%\Microsoft\Windows\Start Menu\Programs\MyManufacturer\MyClickOnceApp.appref-ms"" (""%appdata%\Microsoft\Windows\Start Menu\Programs\MyManufacturer\MyClickOnceApp.appref-ms"") ELSE (start /b """" cmd /c del ""%~f0""&exit /b)" 
Set WshShell = Nothing 

然而,当我运行此代码时,我得到The system cannot find the file specified。这是预期的,因为Exec(或Run或Execute)运行批处理文件而不是批处理代码。那么,是否有类似于Exec的命令将运行批处理代码而不是批处理文件

我不认为解决方案需要一些额外信息(但为了完成而包括在内):

  • 此代码放在启动文件夹
  • 代码在C#中创建,以便在启动时运行ClickOnce应用程序
  • 我想使用vbscript的原因是批处理文件打开cmd窗口一秒钟,这是不可取的。我的理解是,行Set WshShell = Nothing将使命令无形地运行
  • 我尝试在批处理文件的每一行的末尾加上>nul,因为我读到它会停止输出。这对我不起作用。
  • 理论上可以通过同时使用.bat和.vbs文件来工作,但是这需要将.bat文件放在其他目录中,并且感觉一般都是hackish

我对vbscript以外的其他解决方案持开放态度,前提是他们可以检查.appref文件是否存在,如果是,则运行文件,如果文件不存在则自行删除。这在vbscript中可能是微不足道的,但我之前从未使用过vbscript。

编辑: 根据@Jason的评论,我修改了代码如下。现在它运行时没有输出而且没有运行我的应用程序(AKA它不做$#!+)

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run "cmd.exe /C ""IF EXIST ""%appdata%\Microsoft\Windows\Start Menu\Programs\MyManufacturer\MyClickOnceApp.appref-ms"" (""%appdata%\Microsoft\Windows\Start Menu\Programs\MyManufacturer\MyClickOnceApp.appref-ms"") ELSE (start /b """" cmd /c del ""%~f0""&exit /b)", 0
Set WshShell = Nothing 

2 个答案:

答案 0 :(得分:0)

问题是路径中的字符串!像这样工作:

Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "cmd /c if exist test1.txt (echo ok & del test1.txt & pause) else (echo ko & pause)"

尝试使用8.3格式。解决组合名称并且不要使用字符串。

但如果您在VBS中进行编程,为什么还要在其中使用批处理代码?

如果要同时使用两个.BAT文件。或者从您的VBS生成并调用它。

答案 1 :(得分:-1)

这是一个例子:

你有一个名为regex.bat的批次:

@echo off &setlocal
for /f "tokens=1* delims=:" %%i in (
  'netsh wlan show interfaces ^| findstr /rxc:"[ ]* SSID [ ]*: ..*"'
) do for /f "tokens=*" %%k in ("%%j") do set "SSID=%%k"
echo %SSID% > regex.txt

vbs看起来像这样:

Set WshShell = WScript.CreateObject( "WScript.Shell" )
WshShell.Run "regex.bat",0,True 

这对我很有用。没有cmd-Windows出现。希望这有助于你