2017-06-05 11 views
1

バッチファイルをVBSに変換しようとしています。これは私がこれまで持っていたものです。適切な書式設定に関する助言や、このVBSスクリプトが現時点では機能していない理由についての助言を探しています。ここで私はこれまで持っているものです:このバッチをVBS変換が正常に動作するようにする手助けが必要です

OPTION EXPLICIT 
DIM strComputer,strSCVA,strDOSBox 

strComputer = "." ' local computer 
strSCVA = "scva.exe" 
strDOSBox = "dosbox.exe" 

' Check if scva.exe is running at startup (. = local computer) 
IF isProcessRunning(strComputer,strSCVA) THEN 
    Call LoopStart 
ELSE 
    cd "%~dp0../" 
    start /min "" "scva.exe" 
    Call LoopStart 
END IF 

Sub LoopStart 
' Exits script if scva.exe is manually terminated, otherwise, calls CheckDOSBox 
IF isProcessRunning(strComputer,strSCVA) THEN 
    Call CheckDOSBox 
ELSE 
    WScript.Quit 
END IF 

Sub CheckDOSBox 
' Goes to LoopStart while dosbox.exe is running, otherwise, calls Kill 
IF isProcessRunning(strComputer,strDOSBox) THEN 
    Call LoopStart 
ELSE 
    Call Kill 
END IF 

Sub Kill 
' Sends command to terminate scva.exe while scva.exe is running, otherwise, exits script 
IF isProcessRunning(strComputer,strSCVA) THEN 
    taskkill /IM scva.exe 
    Call Kill 
ELSE 
    WScript.Quit 
END IF 

' Function to check if a process is running 
FUNCTION isProcessRunning(BYVAL strComputer,BYVAL strProcessName) 

    DIM objWMIService, strWMIQuery 

    strWMIQuery = "Select * from Win32_Process where name like '" & strProcessName & "'" 

    SET objWMIService = GETOBJECT("winmgmts:" _ 
     & "{impersonationLevel=impersonate}!\\" _ 
      & strComputer & "\root\cimv2") 


    IF objWMIService.ExecQuery(strWMIQuery).Count > 0 THEN 
     isProcessRunning = TRUE 
    ELSE 
     isProcessRunning = FALSE 
    END IF 

END FUNCTION 

をそしてここで、元のバッチ(私も書いた)に変換されていたファイルです:私は私の問題領域がどのように知っていないと思い

REM Runs scva.exe if it is not running; kills process after dosbox.exe is terminated 

tasklist /FI "IMAGENAME eq scva.exe" 2>NUL | find /I /N "scva.exe">NUL 
if "%ERRORLEVEL%"=="0" (
    goto LoopStart 
) else (
    cd "%~dp0../" 
    start /min "" "scva.exe" 
    goto LoopStart 
) 

:LoopStart 
REM Exits script if scva.exe is manually terminated, otherwise, goes to CheckDOSBox 

tasklist /FI "IMAGENAME eq scva.exe" 2>NUL | find /I /N "scva.exe">NUL 
if "%ERRORLEVEL%"=="0" (
    goto CheckDOSBox 
) else (
    exit 
) 

:CheckDOSBox 
REM Goes to LoopStart while dosbox.exe is running, otherwise, goes to Kill 

tasklist /FI "IMAGENAME eq dosbox.exe" 2>NUL | find /I /N "dosbox.exe">NUL 
if "%ERRORLEVEL%"=="0" (
    goto LoopStart 
) else (
    goto Kill 
) 

:Kill 
REM Sends command to terminate scva.exe while scva.exe is running, otherwise, exits script 

tasklist /FI "IMAGENAME eq scva.exe" 2>NUL | find /I /N "scva.exe">NUL 
if "%ERRORLEVEL%"=="0" (
    taskkill /IM scva.exe 
    goto Kill 
) 
exit 

VBSでプログラムを正しく起動する。私はこれをgoogledしましたが、私はその実装を理解しておらず、誰かが自分のコードでどのように動作するかを私に見せてもらえると助けになります。さらに、VBSのcd "%〜dp0 ../"に相当するものは何ですか?言い換えれば、作業ディレクトリをVBSスクリプトの現在のディレクトリに相対的に設定することと同等ですか?

+0

これは最初の「このコードをどのように変換するのですか」という疑問がありましたが、これは実際に_good_です。 – SomethingDark

+0

また、2つのサブ宣言がありますが、 'end sub'はありません。確かに、私の唯一のVB *の経験はVBAですが、私はあなたがそれらを必要とすると確信しています。 – SomethingDark

答えて

2

私はまず予約を掲載してから、実際に手助けできるかどうか確認します。

バッチファイルが正常に動作しているようです。なぜそれをvbscriptに変更したいのですか?

これで十分です。

私がvbscriptを書いたとき、私はサブルーチンを一番上に、メインロジックを一番下に置いていました。私はそれが誰でもやっているのかどうかはわかりませんが、それは私がプログラムをスキャンすることができるということです.を参照して、十数行程度を理解してから実行してください。これは、呼び出された部分に到達すると、それが何のためのものなのか、おおよそ何をするのかをすでに理解していることを意味します。

私がvbscriptに遭遇したcdに最も近いものはWScript.CurrentDirectoryプロパティです。 http://www.vbsedit.com/html/a36f684c-efef-4069-9102-21b3d1d55e9e.asp個人的には、とにかく私のVBスクリプトを起動するためのバッチファイルを書いているので、私はそれを使う傾向がありません。

私は基本的にlistmounts.batを持っている:

cscript %~dp0\listmounts.vbs 

私は貝に原料の多くを行うには、このように、それを起動するので、私はちょうど代わりcscript \path\to\listmounts.vbsの、それを実行するためにlistmountsを入力することを行います。しかし、それは私だけです。

Call(vbscript)は、バッチファイルでgotoと大きく異なる動作をします。 Callは、サブルーチンまたは関数(IsProcessRunningのような)を呼び出し、そのサブルーチンの最後に到達することを期待してから、呼び出し元に戻ります。それは明らかにバッチファイルでgotoがどのように動作するかではありません。たびにcallを呼び出すと、どこから呼び出されたかを管理するメモリが使い果たされ、返ってきたときにそのメモリが再利用されます。だからあなたが設定したものと、コールのクロスオーバーによって、おそらくメモリが足りなくなります。しかし、しばらく時間がかかるかもしれません。

ここで私はそれをどのように構成しますか。私はマシン上にsvcaやdosboxを持っていないし、Linux ATMを走らせているし、テストすることもできないからです)。

OPTION EXPLICIT 
DIM strComputer,strSCVA,strDOSBox 


' start scva if it's not already running. Kill it if dosbox dies. 
' Author: Lucas 5 June 2017 


' Function to check if a process is running 
FUNCTION isProcessRunning(BYVAL strComputer,BYVAL strProcessName) 

    DIM objWMIService, strWMIQuery 

    strWMIQuery = "Select * from Win32_Process where name like '" & strProcessName & "'" 

    SET objWMIService = GETOBJECT("winmgmts:" _ 
     & "{impersonationLevel=impersonate}!\\" _ 
      & strComputer & "\root\cimv2") 


    IF objWMIService.ExecQuery(strWMIQuery).Count > 0 THEN 
     isProcessRunning = TRUE 
    ELSE 
     isProcessRunning = FALSE 
    END IF 

END FUNCTION 


' kill the svca executable. 
SUB KillSvca() 

    ' Keep trying to kill scva until it actually has exited. 
    WHILE isProcessRunning(strComputer,strSCVA) 
     ' this won't actually work - see below for an alternative 
     taskkill /IM scva.exe 
    WEND 
END SUB  

' ------ MAIN PROGRAM ----  


strComputer = "." ' local computer 
strSCVA = "scva.exe" 
strDOSBox = "dosbox.exe" 

' Start SCVA if it's not already running. 

IF NOT isProcessRunning(strComputer,strSCVA) THEN 
    ' As above, I'd make sure it's in the correct folder first 
    cd "%~dp0../" 
    ' And this won't work either. see below. 
    start /min "" "scva.exe" 
END IF 

WHILE isProcessRunning (strComputer, strSCVA) 

    IF NOT isProcessRunning(strComputer,strDOSBox) THEN 
     KIllScva 
    END IF 

WEND 

ポイントのカップル:

  • 私はあなたのisProcessRunning機能が働くと仮定しました。私はそれをうんざりしていない。
  • MAIN PROGRAMのコメントの下ではDIM strComputer,strSCVA,strDOSBoxが理想的ですが、それはパラメータとしてKillSvcaサブルーチンに渡す必要があります。
  • taskkillは、vbscriptで著しくトリッキーになります。これは、VBScriptの唯一の解決策のように見える:Killing processes in Vbscriptが、これは単純How to terminate a process in vbscript
  • に見えるあなたのアプリを起動あまりにも少しトリッキーですが、ここで提案です:Launch programs whose path contains spaces
+0

ありがとう! Call KillScvaを使う代わりに、 "KillScva"を置くだけでいいですか?言い換えれば、 "呼び出し"部分を放棄するだけですか? また、バッチファイルは正常に動作します。しかし、私は説明するのがやや難しい問題があります。私は問題を詳述する短いビデオを作成するかもしれません。なぜなら、テキストを経由するよりも、そのことを説明するほうがずっと簡単だと思うからです。私がこれをするなら、私は再び返信します。 問題は、バッチファイルをVBSに変換しなくても、別の方法で対処できます。 そのバッチファイルの書式設定は正しいですか? – Lucas

+0

はい、私は 'call'は不要です、私がここに持っているlistmounts.vbsファイルにある' sub'を見てください。 – GregHNZ

1

これは、それは、あなたの質問に答えていません

@Echo Off 
Set "_=0" 
TaskList /FI "IMAGENAME eq dosbox.exe" 2>Nul|Find /I "dosbox.exe">Nul&&Set/A _+=1 
TaskList /FI "IMAGENAME eq scva.exe" 2>Nul|Find /I "scva.exe">Nul&&Set/A _+=2 

If %_% Equ 3 Exit/B 

If %_% Equ 2 TaskKill /IM "scva.exe"&&Set/A _-=2 

If %_% Equ 0 Start "" "DOSBox.exe"&&Set/A _+=1 

If %_% Equ 1 Start "" /D "%~dp0.." /MIN "scva.exe" 

あなたは私のAか否かのコメントしてくださいでした:うまくいけば、あなたが行うには、あなたのVBScriptを意図するものの私の評価を複製するための書き換えバッチファイル配達は正しいです。

これは、別のスクリプト言語でこれを再作成する必要がある理由が分かっていることにも興味があります。

関連する問題