如何在命令行中运行VBScript而不使用Cscript/Wscript

22

我是VBScript的初学者。我在Google上搜索了一下并得知我们可以通过执行以下命令从命令行运行VBScript:

例如,我的vbscript名称为Converter.vbs,并且它位于文件夹D:\ VBS中。

我可以通过以下方法运行它:

CScript "D:\VBS\Converter.vbs"
WScript "D:\VBS\Converter.vbs"

现在我想要执行上面的VBScript,而不需要使用Cscript或者Wscript命令,只需简单地键入VBscript名称,即Converter。

我不想每次都指定VBScript的完整路径。

有人可以指导我如何做吗?


1
你不能运行它,它需要一些东西来运行。如果你不指定,那么它将在wscript中运行。无论是wscript还是csript都可以更改此默认设置。在wscript中,Wscript.echo会执行信息框。 - tony bd
将您的脚本添加到注册表中的AppPaths。如果您不想键入.vbs,则必须注册为exe文件。因此,添加HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Converter.exe,并将其默认值设置为cscript //nologo "C:\Users\David Candy\Documents\Assorted\Scripts\converter.vbs",或使用Doskey并自动运行它以加载您的宏。在HKEY_CURRENT_USER\Software\Microsoft\Command Processor中添加一个reg_sz autorun值,即doskey /macrofile=c:\mydoskeymacros.txt。 - tony bd
5个回答

30
I'll break this down into several distinct parts, as each part can be done individually. (我看到了类似的答案,但是我会在这里给出更详细的解释..)
第一部分,为了避免输入"CScript"(或"WScript"), 您需要告诉Windows如何启动一个*.vbs脚本文件。在我的Windows 8中(我不能确定所有这些命令在旧版Windows中是否完全按照此处所示工作,但即使您必须稍微更改命令,过程也是相同的),打开控制台窗口(又称"命令提示符",或者[不正确地]称为"dos提示符")并键入"assoc .vbs"。这应该会得到一个响应,例如:
C:\Windows\System32>assoc .vbs
.vbs=VBSFile

使用此命令,您需要输入“ftype VBSFile”,然后会得到以下响应:
C:\Windows\System32>ftype VBSFile
vbsfile="%SystemRoot%\System32\WScript.exe" "%1" %*

-或-

C:\Windows\System32>ftype VBSFile
vbsfile="%SystemRoot%\System32\CScript.exe" "%1" %*

如果这两个已经像上面那样定义了,那么你的Windows已经设置好了如何启动 * .vbs 文件。 (顺便说一句,WScript和CScript是同一个程序,只是使用不同的名称。 WScript将脚本作为GUI程序启动,而CScript则将其作为命令行程序启动。有关这些详细信息和注意事项,请参阅其他网站和/或文档。)
如果任何一个命令没有像上面那样响应(或者如果assoc报告的文件类型和/或ftype执行的命令具有不同的名称或位置,则为类似的响应),则可以自己输入它们:
C:\Windows\System32>assoc .vbs=VBSFile

-和/或-

C:\Windows\System32>ftype vbsfile="%SystemRoot%\System32\WScript.exe" "%1" %*

你还可以输入"help assoc"或"help ftype"获取更多关于这些命令的信息,这些命令在你想要通过简单地键入特定扩展名的文件名来自动运行某些程序时非常方便。(但要小心,因为一些文件扩展名是由Windows或你可能安装的程序专门设置的,以便它们正常运行。始终检查assoc/ftype报告的当前分配值,并将它们保存在文本文件中,以防需要恢复它们。)

第二部分,在控制台窗口中输入命令时避免输入文件扩展名。了解Windows(和CMD.EXE程序)如何找到您输入的命令对于此(和下一个)部分非常有用。当您输入命令时,让我们以"querty"作为示例命令,系统将首先尝试在其内部命令列表中查找命令(通过Windows注册表中的系统设置或在CMD.EXE中编程)。由于没有这样的命令,它将尝试在当前的%PATH%环境变量中查找命令。在早期版本的DOS / Windows中,CMD.EXE(和/或COMMAND.COM)会自动将文件扩展名".bat",".exe",".com"和可能的".cmd"添加到您键入的命令名称中,除非您显式地键入了扩展名(例如"querty.bat"以避免错误运行"querty.exe")。在更现代的Windows中,它将尝试在%PATHEXT%环境变量中列出的扩展名。因此,您只需将.vbs添加到%PATHEXT%中即可。例如,这是我的%PATHEXT%:

C:\Windows\System32>set pathext
PATHEXT=.PLX;.PLW;.PL;.BAT;.CMD;.VBS;.COM;.EXE;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY

注意,扩展名必须包括“.”,用“;”分隔,而且.VBS在.CMD之后但在.COM之前。这意味着如果命令处理器(CMD.EXE)找到多个匹配项,它将使用列表中的第一个。也就是说,如果我有query.cmd、querty.vbs和querty.com,它将使用querty.cmd。
现在,如果你想一直这样做而不必一直设置%PATHEXT%,你需要修改系统环境。在控制台窗口中输入它只会更改该控制台窗口会话的值。我将把这个过程留给读者作为练习。:-P 第三部分,让脚本在不总是键入完整路径的情况下运行。这一部分与第二部分相关,自DOS时代以来就存在。只需确保文件位于%PATH%环境变量中列出的目录(文件夹,对于Windows用户而言!)之一中即可。我的建议是创建自己的目录,用于存储您经常创建或使用的各种文件和程序从控制台窗口/命令提示符(也就是说,不要担心为从开始菜单或任何其他方法运行的程序执行此操作...仅适用于控制台窗口。除非您知道自己在做什么,否则不要操纵由Windows或自动安装程序安装的程序。)。
个人而言,我总是为批处理文件创建一个“C:\ sys \ bat”目录,为* .exe和* .com文件创建一个“C:\ sys \ bin”目录(例如,如果您下载类似于“md5sum”的MD5校验和实用程序),为VBScripts创建一个“C:\ sys \ wsh”目录(以及名为“wsh”的JScripts,因为两者都使用“Windows脚本宿主”或“wsh”程序执行),等等。然后,我将它们添加到系统的% PATH%变量中(控制面板->高级系统设置->高级选项卡->环境变量按钮),这样当我输入它们时,Windows就可以始终找到它们。
将这三个部分组合起来,就可以配置您的Windows系统,以便在任何地方输入命令行命令时,只需键入基本文件名即可启动您的VBScript。您也可以对几乎任何文件类型/扩展名执行相同的操作;正如您在我的%PATHEXT%输出中看到的那样,我的系统设置为运行Perl脚本(.PLX;.PLW;.PL)和Python(.PY)脚本。 (我还将“C:\sys\bat;C:\sys\scripts;C:\sys\wsh;C:\sys\bin”放在%PATH%的前面,并将各种批处理文件、脚本文件等放在这些目录中,这样Windows就可以随时找到它们。如果您想要“覆盖”某些命令,这也很方便:将* .bat文件放在路径的最前面会使系统先找到它们,而不是* .exe文件,例如,然后* .bat文件可以通过给出实际*.exe文件的完整路径来启动实际程序。查看有关“批处理文件编程”的各种网站,了解详细信息和其他命令行强大示例。它还没有死!) 最后提醒:一定要查看其他网站上的各种警告和注意事项。这个问题提出了一个名为“converter.vbs”的脚本,它非常接近命令“convert.exe”,这是一个将硬盘从FAT文件系统转换为NTFS文件系统的Windows程序...如果您打错字,可能会毁掉您的硬盘!
另一方面,使用上述技巧,您也可以避免这样的错误。以CONVERT.EXE为例...将其重命名为“REAL_CONVERT.EXE”,然后创建一个名为“C:\sys\bat\convert.bat”的文件,其中包含:
@ECHO OFF
ECHO !DANGER! !DANGER! !DANGER! !DANGER, WILL ROBINSON!

ECHO This command will convert your hard drive to NTFS! DO YOU REALLY WANT TO DO THIS?!
ECHO PRESS CONTROL-C TO ABORT, otherwise..

REM "PAUSE" will pause the batch file with the message "Press any key to continue...",
REM and also allow the user to press CONTROL-C which will prompt the user to abort or
REM continue running the batch file.
PAUSE

ECHO Okay, if you're really determined to do this, type this command:
ECHO.    %SystemRoot%\SYSTEM32\REAL_CONVERT.EXE
ECHO to run the real CONVERT.EXE program. Have a nice day!

您也可以在现代Windows中使用CHOICE.EXE,让用户输入“y”或“n”,以确保他们真正想要继续等等。批处理文件(和脚本)的强大之处再次体现!以下是一些有关如何使用所有这些功能的良好资源链接:

http://ss64.com/

http://www.computerhope.com/batch.htm

http://commandwindows.com/batch.htm

http://www.robvanderwoude.com/batchfiles.php

大多数这些网站都针对批处理文件,但其中的大部分信息适用于运行任何类型的批处理(*.bat)文件、命令(*.cmd)文件和脚本(*.vbs, *.js, *.pl, *.py等)文件。

1
哇...如果可以的话,我会给这个答案+100票!多么深入和有用的帖子啊!赞! - Kenny83
你应该写书了。你不遗漏任何细节,用简单的语言深入解释。我喜欢这个。 - Badr Elmers

10

当在命令行中输入脚本的完整文件规范或文件名时,shell将使用可访问的信息

与之相关。
assoc | grep -i vbs
.vbs=VBSFile

ftype | grep -i vbs
VBSFile=%SystemRoot%\System32\CScript.exe "%1" %*

决定运行脚本的程序。在我的情况下,它是cscript.exe,在你的情况下将会是wscript.exe - 这就解释了为什么你的WScript.Echos结果会出现在MsgBoxes中。

cscript /?
Usage: CScript scriptname.extension [option...] [arguments...]

Options:
 //B         Batch mode: Suppresses script errors and prompts from displaying
 //D         Enable Active Debugging
 //E:engine  Use engine for executing script
 //H:CScript Changes the default script host to CScript.exe
 //H:WScript Changes the default script host to WScript.exe (default)
 //I         Interactive mode (default, opposite of //B)
 //Job:xxxx  Execute a WSF job
 //Logo      Display logo (default)
 //Nologo    Prevent logo display: No banner will be shown at execution time
 //S         Save current command line options for this user
 //T:nn      Time out in seconds:  Maximum time a script is permitted to run
 //X         Execute script in debugger
 //U         Use Unicode for redirected I/O from the console

显示,您可以使用//E和//S永久将默认主机切换到cscript.exe。

如果您懒得连扩展名都不想输入,请确保设置了PATHEXT环境变量。

set | grep -i vbs
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.py;.pyw;.tcl;.PSC1

如果你的路径中没有转换器(将您的硬盘转换为洗衣机)的Converter.cmd文件,而且其中包含.VBS文件,则可以:

  1. 将CONVERTER.VBS放入包含在PATH环境变量中的文件夹中;然后shell将在所有路径中搜索匹配的“可执行文件”,必要时考虑PATHEXT和ftype/assoc信息。
  2. 将CONVERTER.BAT/.CMD放入一个包含以下行的路径目录中:cscript p:\ath\to\CONVERTER.VBS

两种情况下,我都会打出扩展名以避免(讨厌的)意外。


感谢Ekkehard.Horner的回复。我的主要疑问是,我不想每次运行vbscript时都指定完整路径。有没有办法设置vbscript的路径并通过简单输入脚本名称来运行它?我已经相应地更新了我的问题。 - Solution Seeker
1
在 Windows 系统中找不到类似于 grep 命令的功能?你可以安装一个小巧的工具。但其实,你可以通过 Windows 自带的 find 命令来实现相同的功能:ftype | find "vbs" /i - Bond
如果你从“程序和功能”中安装了Unix子系统,那么可以使用grep命令。或者使用ftype vbsfile命令。 - tony bd

7

我想知道为什么不能将这个放在批处理文件中。例如:

cd D:\VBS\
WSCript Converter.vbs

把上述代码放入一个文本文件中,并将文本文件保存为 .bat 扩展名。现在,您只需运行此 .bat 文件即可。

5
为什么不将vbscript存储在批处理/vbscript文件混合体中。将批处理混合体命名为Converter.bat,您可以直接从cmd行执行它作为Converter。当然,您可以将所有脚本默认设置为从Cscript或Wscript运行,但如果您想将vbs作为Windows脚本而不是控制台脚本执行,这可能会在以后造成一些困惑。因此,只需将代码设置为批处理文件并直接运行即可。
检查答案-> 这里 以下是示例:

Converter.bat

::' VBS/Batch Hybrid
::' --- Batch portion ---------
rem^ &@echo off
rem^ &call :'sub
rem^ &exit /b

:'sub
rem^ &echo begin batch
rem^ &cscript //nologo //e:vbscript "%~f0"
rem^ &echo end batch
rem^ &exit /b

'----- VBS portion -----
Dim tester
tester = "Convert data here"
Msgbox tester

1

您可以按照以下步骤进行操作:

  • 打开CMD(命令提示符)
  • 输入“D:”并按下Enter键。 示例: C:\Users\[Your User Name]>D:
  • 输入“CD VBS”并按下Enter键。示例: D:>CD VBS
  • 输入“Converter.vbs”或“start Converter.vbs”,然后按下Enter键。示例: D:\VBS>Converter.vbsD:\VBS>start Converter.vbs

这是一个不错的答案。 - Amar Anondo
感谢您的帮助。 - Md Wahid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接