2016-10-12 5 views
0

VirtualBoxをフリーズするアクセスできないVirtualBoxマシンに問題があり、Windowsタスクマネージャを使用してリセットする必要があります。これらのVirtualBoxインスタンスは既に.batファイルによって起動されているため、起動する前にアクセスできないマシン(のみ)の登録を解除するために、.batにコードを追加したいと考えました。ディスクにファイルを書き込むのではなく、varを使ってファイルを書き込もうとしています。私は現在アクセスできないマシンをエコーし​​ます、次のコードを持っている:アクセスできないVirtualBoxの登録を解除するバッチファイル

ECHO OFF 
SET LOCAL ENABLEDELAYEDEXPANSION 
SET var=%%F 
FOR /F "tokens=* USEBACKQ" %%F IN (`"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms`) DO (
ECHO.%var% | FIND /I "inaccessible">Nul && (ECHO %var%) 
) 

は、私は、これはループ内検索を使用するための正しい方法であるようにわからないんだけど、いずれのケースでは私が達成したいものをアクセス不可能なマシンを見つけた後、それを登録解除するために、そのUUIDを使用するようにされています。一緒にこのパズルの2つの部分を取得し、作業

SET SUBSTRING=%UUID:~18,-1% 
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" unregistervm %SUBSTRING% > nul) 

ヘルプははるかに高く評価します。

答えて

1

これは、これらをまとめたものです。私はvboxmanageを持っていないので、私は確かにそれをテストすることはできませんが、あなたはこの仕事をすることができるはずです。

@ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /F "tokens=*" %%F IN ('""C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms | FIND /i "inaccessible""') DO (
    SET SUBSTRING=%%F 
    SET SUBSTRING=!SUBSTRING:~18,-1! 
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" unregistervm !SUBSTRING! 
) 

トリッキーな部分は、バッチは、パスの前後に引用符とfind文字列を解釈するようにする方法を考え出すされています。結局、文字列全体を引用符で囲んだだけで、うまくいきました。 (別名:通常は|をエスケープする必要がありますが、全体が引用符で囲まれている場合は除きません)。

また、部分文字列の置換と遅延拡張を行う必要はありません。トークンと区切り文字はforにありますが、私はvboxmanageの出力を知らないので、私はそこであなたを助けることはできません。

+0

サイドノート: 'SETLOCAL'は1語です。 – soja

+0

これは非常にうまくいった。ありがとうございました。 – user2565422

関連する問題