サーチ…


前書き

Batchは、 VBS機能を使用して実行することができ、その信頼性をさらに高めます。たとえば、 VBSでは小数点、スペース、およびbatchでは実行できないその他の高度な操作を処理できます。また、WMIとActiveXオブジェクトを操作することもできます。

一時ファイルでVBSを実行する

batchから別のスクリプトを実行する旧式の方法は、スクリプトを別の場所にechoてから実行することです。

この方法は次のように表現できます。

@echo off
rem VBS below
    echo your vbs > TempVBS.vbs
    echo other vbs>>TempVBS.vbs
rem End of VBS

cscript //nologo TempVBS.vbs
del /f /s /q TempVBS.vbs

上記の方法では多くのecho (vbs) >> TempVBS.vbsが必要なので、短縮する方法があります。 (コードAacini)

@echo off
setlocal

rem Get the number of the "<resource>" line
for /F "delims=:" %%a in ('findstr /N "<resource>" "%~F0"') do set "start=%%a"

rem Skip such number of lines and show the rest of this file
(for /F "usebackq skip=%start% delims=" %%a in ("%~F0") do echo %%a) > Program.vbs

cscript //nologo Program.vbs
del /f /s /q Program.vbs
exit /b

<resource>
your vbs
another line of vbs

最後の方法はstreamsを使うことです。ファイルにはいくつかのストリームがあります。また、すべてのストリームに異なる情報を含めることができます。

@echo off

    echo vbs >%0:stream1
    rem This command redirect "vbs" into the stream1 of this script, then we can call it later

cscript %0:stream1 //nologo
   rem if you like, you can clear the stream1 of this file by:
   type nul>%0:stream1

一時ファイルを使わずにバッチファイルにVBScriptコードを埋め込む

dostipsフォーラムのユーザーLiviuによって発明された技術(ハック)の例を以下に示します。

@echo off
echo Printed by CMD.EXE
cscript //nologo "%~f0?.wsf" //job:JS //job:VBS

exit /b %errorlevel%

----END OF BATCH CODE---
<package>
  <job id="JS"> 
    <script language="VBScript">
    
        WScript.Echo("Printed by VBScript"):
        
    </script>
  </job>
  <job id="VBS"> 
    <script language="JScript">
    
        WScript.Echo("Printed by JScript");
        
    </script>
  </job>
</package>

wsfファイルをWindowsで実行すると、 スクリプトホストは拡張機能の影響を受け?.wsf 、ファイルの最後に?.wsf (ハックの核心部分)を追加すると、任意の拡張子のファイルを実行できます。 Liviuの例はおそらくより堅牢ですが、上記のコードはより単純化されたバージョンです。 wshは<package>ノード以外のものについてはあまり気にしないので、xmlコメントにすべてを入れる必要はありません。リダイレクション記号( <> )は注意が必要ですが、



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow