VMWare VIXを使ってVMWare Playerをコマンドプロンプトから操作する


# 概要
VMWare VIXのvmrun.exeを利用して、VMWare Playerの仮想マシンをコマンドプロンプトから起動したり終了したりコマンドを投入したりします。


## 必要なもの
* VMWare Player
* VMWare VIX


## 検証環境
### ホスト環境
* Windows 8.1 64bit
* VMware-player-7.1.0-2496824
* VMware-VIX-1.14.1-2496824


### 仮想マシン
* FreeBSD 10.1 amd64
    * pkgngから「open-vm-tools」(オープン版のVMWare Tools)をインストール済み


# コマンドラインからの操作

* ESXi用のコマンドなど、Playerで動かないものは省きました。
* プラットフォームの指定について、VMWare Playerは「-T player」ですが、省いても動いたので省きました。

## 前準備
毎度毎度フルパスを書くには面倒なので、環境変数を設定しておきます。

```bat
set VMRUN_EXE="C:\Program Files (x86)\VMware\VMware VIX\vmrun.exe"
set VM_VMX=VM-FreeBSD.vmx
```

## VMWare Toolsがなくてもできること
仮想マシンの起動・終了・再起動・サスペンドは、VMWare Toolsがなくても実行できます。


#### 仮想マシンの起動(start)

```bat
rem 通常の起動
%VMRUN_EXE% start "%VM_VMX%"
rem GUIなし(非表示)で起動
%VMRUN_EXE% start "%VM_VMX%" nogui
```

#### 仮想マシンの終了(stop)

```bat
rem シャットダウン
%VMRUN_EXE% stop "%VM_VMX%"
rem 強制シャットダウン
%VMRUN_EXE% stop "%VM_VMX%" hard
```

#### 仮想マシンの再起動(reset)

```bat
rem 再起動
%VMRUN_EXE% reset "%VM_VMX%"
rem 強制再起動
%VMRUN_EXE% reset "%VM_VMX%" hard
```

#### 仮想マシンのサスペンド(suspend)

```bat
rem サスペンド
%VMRUN_EXE% suspend "%VM_VMX%"
rem 強制サスペンド
%VMRUN_EXE% suspend "%VM_VMX%" hard
```


## VMWare Toolsがあればできること
 VMWare Toolsがインストール済みの仮想マシンに対しては、コマンドを実行したりファイルを転送したりできます。
 
 ※ユーザ名「hoge」パスワード「pass」を設定している場合、で検証します
 
 
### ＜コマンド実行系＞

※ユーザ名とパスワードが必要

#### プログラムの実行(runProgramInGuest)
 
```bat
rem とりあえずlsしてみる
%VMRUN_EXE% -gu hoge -gp pass runProgramInGuest "%VM_VMX%" /bin/ls
rem スクリプトを実行する(実行権限があるとき)
%VMRUN_EXE% -gu hoge -gp pass runProgramInGuest "%VM_VMX%"  /home/hoge/aaa.sh
rem スクリプトを実行する(実行権限がないとき)
%VMRUN_EXE% -gu hoge -gp pass runProgramInGuest "%VM_VMX%" /bin/sh -c "/bin/sh /home/hoge/aaa.sh"
```

※カレントディレクトリは「/」になってました
※PATHが通ってないっぽいので、コマンドもフルパスで指定します
※実行結果はコンソールに表示されません

#### スクリプトの実行(runScriptInGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass runScriptInGuest "%VM_VMX%" /bin/sh /home/hoge/aaa.sh
```

runProgramInGuestとほとんど同じ。
こちらでは、インタプリタのパスとスクリプトのパスを指定します。


### <プロセス操作系>
#### プロセスの一覧を表示(listProcessesInGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass listProcessesInGuest "%VM_VMX%"
```

#### プロセスを消す(killProcessInGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass killProcessInGuest "%VM_VMX%" 858
```


### ＜ファイル操作系＞

※ユーザ名とパスワードが必要

#### ファイルの存在をチェック(fileExistsInGuest)
 
```bat
rem ファイルが存在するとき
%VMRUN_EXE% -gu hoge -gp pass fileExistsInGuest "%VM_VMX%" /home/hoge/aaa.sh
rem => The file exists.
rem => %ERRORLEVEL% は 0 になる

rem ファイルが存在しないとき
%VMRUN_EXE% -gu hoge -gp pass fileExistsInGuest "%VM_VMX%" /home/hoge/bbb.sh
rem => The file does not exist.
rem => %ERRORLEVEL% は -1 になる
```

#### ファイル名を変更する(renameFileInGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass renameFileInGuest "%VM_VMX%" /home/hoge/from-file /home/hoge/to-file
```

#### ファイルを削除する(deleteFileInGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass deleteFileInGuest "%VM_VMX%" /home/hoge/to-file
```

#### ディレクトリの存在チェック(directoryExistsInGuest)
 
```bat
rem ディレクトリが存在するとき
%VMRUN_EXE% -gu hoge -gp pass directoryExistsInGuest "%VM_VMX%" /home/hoge
rem => The directory exists.
rem => %ERRORLEVEL% は 0 になる

rem ディレクトリが存在しないとき
%VMRUN_EXE% -gu hoge -gp pass directoryExistsInGuest "%VM_VMX%" /home/fugafuga
rem => The directory does not exist.
rem => %ERRORLEVEL% は -1 になる
```

#### ディレクトリを作成する(createDirectoryInGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass createDirectoryInGuest "%VM_VMX%" /home/hoge/newdir
```

#### ファイルの一覧を取得する(listDirectoryInGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass listDirectoryInGuest "%VM_VMX%" /home/hoge
```

#### ディレクトリを削除する(deleteDirectoryInGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass deleteDirectoryInGuest "%VM_VMX%" /home/hoge/newdir
```


### ＜データ転送系＞

※ユーザ名とパスワードが必要

#### ホストから仮想マシンへファイルを転送する(copyFileFromHostToGuest)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass copyFileFromHostToGuest "%VM_VMX%" hostfile.txt /home/hoge/hostfile.txt
```

#### 仮想マシンからホストへファイルを転送する(copyFileFromGuestToHost)
 
```bat
%VMRUN_EXE% -gu hoge -gp pass copyFileFromGuestToHost "%VM_VMX%" /home/hoge/guestfile.txt guestfile.txt
```


### ＜共有フォルダ設定＞
#### 共有フォルダを有効にする(enableSharedFolders)

```bat
%VMRUN_EXE% enableSharedFolders "%VM_VMX%"
```

※再起動すると元に戻る

#### 共有フォルダを無効にする(disableSharedFolders)

```bat
%VMRUN_EXE% disableSharedFolders "%VM_VMX%"
```

※再起動すると元に戻る

#### 共有フォルダ設定を追加する(addSharedFolder)

```bat
%VMRUN_EXE% addSharedFolder "%VM_VMX%" sharename %CD%
```

※これは再起動しても残る

#### 共有フォルダ設定を削除する(removeSharedFolder)

```bat
%VMRUN_EXE% removeSharedFolder "%VM_VMX%" sharename
```

#### 共有フォルダの読み書き設定を変更する(setSharedFolderState)

```bat
rem 共有フォルダを書き込みOKの設定にする
%VMRUN_EXE% setSharedFolderState "%VM_VMX%" sharename %CD% writable

rem 共有フォルダを読み取り専用にする。ついでにホスト側のパスも変更する。
%VMRUN_EXE% setSharedFolderState "%VM_VMX%" sharename %CD%\..\ readonly
```


### ＜その他＞

※有効なログインユーザが必要

#### 仮想マシンのスクリーンショットを取得する(captureScreen)

```bat
%VMRUN_EXE% -gu hoge -gp pass captureScreen "%VM_VMX%" %USERPROFILE%\Desktop\captuer.png
```

#### 仮想マシンの環境変数に書き込む？(writeVariable)

よくわかりませんが、とりあえず記入

```bat
rem 一時変数の定義
%VMRUN_EXE% -gu hoge -gp pass writeVariable "%VM_VMX%" guestVar HOGE_VAR1 1111

rem 設定ファイルの変数を定義(.vmxファイルに保存される)
%VMRUN_EXE% -gu hoge -gp pass writeVariable "%VM_VMX%" runtimeConfig HOGE_VAR2 2222

rem 仮想マシンの環境変数に書き込み
%VMRUN_EXE% -gu root -gp vmpass writeVariable "%VM_VMX%" guestEnv HOGE_VAR3 3333
```

※「guestEnv」で書き込む場合、管理者ユーザを指定する必要あり。

#### 仮想マシンの環境変数を表示？(readVariable)

よくわかりませんが、とりあえず記入

```bat
rem 一時変数から読み込み
%VMRUN_EXE% -gu hoge -gp pass readVariable "%VM_VMX%" guestVar HOGE_VAR1

rem 設定ファイルから読み込み
%VMRUN_EXE% -gu hoge -gp pass readVariable "%VM_VMX%" runtimeConfig HOGE_VAR2

rem 仮想マシンの環境変数から読み込み
%VMRUN_EXE% -gu root -gp vmpass readVariable "%VM_VMX%" guestEnv HOGE_VAR3
```

## 仮想マシンのメンテナンス
#### 仮想マシンの一覧を表示(list)

```bat
%VMRUN_EXE% list
```

#### 仮想マシンの削除(deleteVM)

```bat
%VMRUN_EXE% deleteVM "%VM_VMX%"
```

※仮想マシンが起動中は実行不可。stopしてから。

#### 仮想マシンをコピー(clone)

```bat
%VMRUN_EXE% clone "%VM_VMX%" ..\distdir
```

※仮想マシンが起動中は実行不可。stopしてから。





# 参考資料
* [Using vmrun to Control Virtual Machines]( https://www.vmware.com/support/developer/vix-api/vix111_vmrun_command.pdf)