【问题标题】:How to run VBScript from command line without Cscript/Wscript如何在没有 Cscript/Wscript 的情况下从命令行运行 VBScript
【发布时间】:2014-05-29 06:13:21
【问题描述】:

我是 VBScript 的初学者。我用谷歌搜索并知道我们可以通过执行以下命令从命令行运行 VBScript:

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

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

CScript "D:\VBS\Converter.vbs"

或

WScript "D:\VBS\Converter.vbs"

现在我想执行上面的VBScript 没有 Cscript 或Wscript 命令,只需输入VBscript 名称,即Converter。

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

谁能指导我如何做到这一点?

【问题讨论】:

  • 你不能,它需要一些东西来运行它。如果您不指定,那么它将在 wscript 中运行。 wscript 和 csript 都可以更改此默认值。 wscript.echo 在 wscript 中做消息框。
  • 将您的脚本添加到注册表中的 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并自动运行它来加载你的宏。向 doskey /macrofile=c:\mydoskeymacros.txt 的 HKEY_CURRENT_USER\Software\Microsoft\Command Processor 添加一个 reg_sz 自动运行值

标签: vbscript


【解决方案1】:

当在命令行输入脚本的完整文件规范或其文件名时,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

包含 .VBS,并且您的路径中没有 Converter.cmd(将您的硬盘转换为洗衣机)。

更新评论:

如果您“不想每次都指定我的 vbscript 的完整路径”,您可以:

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

在两种情况下,我都会输入扩展名以避免(令人讨厌的)意外。

【讨论】:

  • 感谢 Ekkehard.Horner 的回复。我的主要疑问是我不想在每次运行时都指定我的 vbscript 的完整路径。有什么方法可以彻底设置我的 vbscript 的路径并通过简单地输入脚本名来运行它。我已经相应地更新了我的问题。
  • +1 但grep 用于 Windows?你必须安装一个整洁的小工具。以下是使用 Windows 愚蠢的find 命令的方法:ftype | find "vbs" /i
  • 或 ftype vbsfile。如果您从 Programs and Features 安装 unix 子系统,则可以使用 Grep。
【解决方案2】:

为什么不将 vbscript 存储在批处理/vbscript 混合文件中。将批处理混合 Converter.bat 命名为,您可以在 cmd 行中直接将其作为 Converter 执行。当然,您可以默认所有脚本从 Cscript 或 Wscript 运行,但如果您想将 vbs 作为 windows 脚本而不是控制台脚本执行,这可能会在以后引起一些混乱。因此,只需将您的代码设置为批处理文件并直接运行即可。

查看答案 -> Here

这是一个例子:

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

【讨论】:

    【解决方案3】:

    我将把它分解成几个不同的部分,因为每个部分都可以单独完成。 (我看到类似的答案,但我将在这里给出更详细的解释..)

    第一部分,为了避免输入“CScript”(或“WScript”),您需要告诉 Windows 如何启动 * .vbs 脚本文件。在我的 Windows 8 中(我不能确定所有这些命令在旧 Windows 中完全按照此处所示的方式工作,但过程是相同的,即使您必须稍微更改命令),启动控制台窗口(又名“命令提示符”,或 [不正确] “dos prompt”)并输入“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 程序)如何找到您键入的命令对此很有用(以及下)部分。当您键入命令时,让我们使用“查询”作为示例命令,系统将首先尝试在其内部命令列表中找到该命令(通过系统本身的 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 校验和实用程序),一个“C:\sys\wsh”目录,用于 VBScript(和 JScript,命名为“wsh”,因为两者都是使用“Windows Scripting Host”或“wsh”程序执行的),以及很快。然后我将这些添加到我的系统 %PATH% 变量(控制面板 -> 高级系统设置 -> 高级选项卡 -> 环境变量按钮),这样当我键入它们时,Windows 总能找到它们。

    结合所有三个部分将配置您的 Windows 系统,以便在您可以键入命令行命令的任何地方,只需键入基本文件名即可启动 VBScript。您几乎可以对任何文件类型/扩展名执行相同的操作;正如您可能在我的 %PATHEXT% 输出中看到的那样,我的系统设置为也可以运行 Perl 脚本 (.PLX;.PLW;.PL) 和 Python (.PY) 脚本。 (我还在我的%PATH%前面放了“C:\sys\bat;C:\sys\scripts;C:\sys\wsh;C:\sys\bin”,并放了各种批处理文件,脚本文件, 等等, 在这些目录中, 所以 Windows 总是可以找到它们。如果你想“覆盖”某些命令, 这也很方便: 将 * .bat 文件放在路径中使系统在 * .exe 文件之前找到它们, 例如, 然后 *.bat 文件可以通过提供实际 *.exe 文件的完整路径来启动实际程序。查看“批处理文件编程”的各个站点以获取详细信息和其他示例命令行..它还没有死!)

    最后一点:请查看其他一些网站,了解各种警告和注意事项。这个问题提出了一个名为“converter.vbs”的脚本,它非常接近命令“convert.exe”,这是一个 Windows 程序,用于将硬盘从 FAT 文件系统转换为 NTFS 文件系统。可以如果您输入错误,请破坏您的硬盘!

    另一方面,使用上述技术,您也可以避免此类错误。以 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 等)文件。

    【讨论】:

    • 哇...如果可以的话,我会给这个答案+100 票!多么深入和有用的帖子啊!赞一个!
    • 你应该在写书。你不留下任何细节,你用简单的话深入解释。我喜欢这个
    【解决方案4】:

    我想知道为什么你不能把它放在一个批处理文件中。示例:

    cd D:\VBS\
    WSCript Converter.vbs
    

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 答案很好。
      • 感谢您的帮助。
      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 2013-11-01
      • 2021-06-30
      • 2022-07-01
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多