我有一个简单的问题:
什么是从Windows批处理(.bat)脚本执行单个的WshShell命令的最佳方式?
(希望它不创建与VB代码创建一个新的文件)
我有一个简单的问题:
什么是从Windows批处理(.bat)脚本执行单个的WshShell命令的最佳方式?
(希望它不创建与VB代码创建一个新的文件)
您可以通过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变量=
不保证定义。
这是我用它来写一个批处理的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
。
由于上述的激励我做了轻微的修改。
@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)