从批处理脚本执行的WshShell命令(execute WshShell command from

2019-07-20 20:04发布

我有一个简单的问题:

什么是从Windows批处理(.bat)脚本执行单个的WshShell命令的最佳方式?

(希望它不创建与VB代码创建一个新的文件)

Answer 1:

您可以通过VBScript或Jscript脚本访问的WshShell。 既可以嵌入在批处理文件中,但JScript是干净多了。

大多数人通过写一个临时VBS文件批量内执行的VBScript。 但它有可能做到这一点没有一个临时文件。 查看是否有可能嵌入和不使用临时文件的批处理文件中执行的VBScript? 对各种选项。

批次内嵌入JScript是很容易的。 见https://stackoverflow.com/a/5656250/1012053 。 我使用该技术的一个非常微小的变化。

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

:: ******* Begin batch code *********
@echo off
:: Your batch logic goes here

:: At any point you can execute the following to access your JScript
cscript //E:JScript //nologo "%~f0" yourJscriptParametersGoHere

:: Be sure to terminate your script so that 
:: it does not fall through into the JScript code
exit /b

********* Begin JScript code **********/
var WshShell=WScript.CreateObject("WScript.Shell")

/* do whatever with your WshShell object */

说明:

该技术的关键是第一行。 它必须是一个具有有效的语法都JScript和批次线。

批量看到的第一线作为一个简单的IF命令总是计算为false,那么它永远不会执行不存在的@end命令,并没有造成任何伤害。 以下行都是正常批次代码,直到出口/ B达到,在该点批处理结束,同时,其余的行被忽略。

JScript中看到的第一线为空条件编译块,然后是多行注释的开始。 JScript中忽略了下面的批处理代码,因为它是注释的一部分。 注释结尾*/ ,然后正常JScript代码如下。

可能失败的唯一的事情是,如果您的批处理代码必须有*/之内的,因为这会过早地结束JScript的评论。 但是,这可以通过将之间的事情来解决*/批处理分析后消失。 如果代码没有报价,那么你可以简单地逃脱斜线如下: *^/ 。 如果代码被引用,那么你可以扩展一个未定义的变量: *%=%/ 。 命名为A变量=不保证定义。



Answer 2:

这是我用它来写一个批处理的JScript脚本混合的方法:

@if (@CodeSection == @Batch) @then

:: The first line above is...
:: in Batch: a valid IF command that does nothing.
:: in JScript: a conditional compilation IF statement that is false,
::             so this section is omitted until next "at-sign end".


@echo off

rem EXPR.BAT: Evaluate a JScript (arithmetic) expression
rem Antonio Perez Ayala

rem Define an auxiliary variable to call JScript
set JSCall=Cscript //nologo //E:JScript "%~F0"

rem Do Batch business here, for example:
%JSCall% %1
goto :EOF

End of Batch section


@end


// JScript section

WScript.Echo(eval(WScript.Arguments.Unnamed.Item(0)));

例如:

EXPR 1/3

编辑 :如果你想有一个更简单的/更短的方法,用这个:

@set @a=0  /*
@cscript //nologo //E:JScript "%~F0" "%~1"
@goto :EOF */

WScript.Echo(eval(WScript.Arguments(0)));

再次,第一@set @a=0 /*是在两JScript和批次一个有效的语句/命令,其仅用于插入一个JScript注释(/ *)的开始,所以批部通过的JScript被忽略。 注释将最终关闭后(* /) goto :EOF



Answer 3:

由于上述的激励我做了轻微的修改。

@if (false)==nul ======= CMD code =======
@echo off
::code before Cscript
cscript //nologo //e:jscript "%~f0" %*
echo it returns: %errorlevel%
::code after Cscript 
exit /b
=================================
Freedom Land ^o^
======= J/VB Script code ======
@end
// Start Cscript
WScript.Echo("wsh says: Hello, Universe!");
WScript.Quit(123.456)


文章来源: execute WshShell command from a batch script