C#からVBScriptファイルを実行

C#からVBScriptファイルを実行する方法はいくつかありますが
以下の方法もそのひとつ。
  1. public void ExecVBS (string vbsFilePath)
  2. {
  3.     int sPos = vbsFilePath.LastIndexOf("\\");
  4.     string dir = vbsFilePath.Substring(0, sPos);
  5.     string fn = vbsFilePath.Substring(sPos + 1, vbsFilePath.Length() - sPos - 1);

  6.     using (Process proc = new Process())
  7.     {
  8.         proc.StartInfo.FileName = "cscript.exe";
  9.         proc.StartInfo.WorkingDirectory = dir;          //Path.GetDirectory(vbsFilePath);では失敗するかも
  10.         proc.StartInfo.Argments = "//B //Nologo " + fn; //Path.GetFileName(vbsFilePath);では失敗するかも
  11.         proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  12.         Proc.StartInfo.CreateNoWindow = true;
  13.         proc.Start();
  14.         proc.WaitForExit();
  15.         proc.Close();
  16.     }
  17. }
3行目~5行目で、vbsファイルの格納先ディレクトリとファイル名を取得していますが、Path.GetDirectory、Path.GetFileNameは、あえて使用していません。

vbScriptファイルを実行する際に、cscript.exe にパスを渡しますがクオートで囲っても上手く起動できませんでした。
原因調査で分かったのですが、cscript.exeの制限かバグか、空白文字を含んだパスを指定すると失敗しました。
そのため考えたのが、短いパス名に変換したパスを渡すことです。これなら空白を含むことはあり得ません。

ただし、この回避策でショートパス(MS-DOSの8.3形式)に予め変換したパスを渡しても、10~11行目で GetDirectory、GetFileNameを使用してしまうとロングファイル名が返るので意味がありません。あえて使用せず、3行目~5行目で代用処理しているのはこのためです。
ショートパスを愚直にsubstringで切り出すのが得策です

ExecVBS(GetShortPath(vbsFilePath));

これで呼び出せます
※GetShortPath は、以前ご紹介した「C#からショートパスを得るもう一つの方法」を参照

コメント