VBS(VBScript)を使うと、コマンドプロンプトを起動してコマンドを自動実行できます。
今回は、テキストファイルに記載した複数のコマンドをVBSから実行する方法を試してみました。
例えば、以下のようなテキストファイルを用意します。
hogehoge
hogehoge02
hogehoge03
hogehoge04
cd ..このテキストファイルの内容をコマンドプロンプトで実行する処理を、VBSから自動化します。
処理としては以下のような流れになります。
- テキストファイルにコマンドを記載
- VBSからテキストファイルを読み込む
- コマンドプロンプトを起動
- テキストファイルに記載したコマンドを実行
1.事前準備
1-1.実行するコマンドをテキストファイルに記載する
まず、実行したいコマンドをテキストファイルに記載します。
今回は hoge.txt というファイルを作成し、以下の内容を記載します。
cd C:\work
dir
mkdir test
echo test > test.txtこのように、1行に1つずつコマンドを記載します。
上記の場合、コマンドプロンプトで上から順番にコマンドが実行されます。
1-2.VBSからコマンドを実行する方法
VBSからコマンドプロンプトを起動するには、WScript.Shell を使用します。
Dim WS
Set WS = WScript.CreateObject("WScript.Shell")
WS.Run "cmd.exe"これだけで、VBSからコマンドプロンプトを起動できます。
一方でテキストファイルを開いて Ctrl + A、Ctrl + C、Ctrl + V を実行する方法もありますが、アクティブになっているウィンドウに処理が依存するため、あまり安定した方法ではありません。
そこで今回は、テキストファイルの内容をVBSから読み込み、一時的なバッチファイルを作成して実行する方法を使用します。
1-3.テキストファイルの内容をVBSから読み込む方法
テキストファイルの読み込みには、FileSystemObject を使用します。
Dim FSO
Dim File
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile("C:\hogehoge\hoge.txt", 1)
Do Until File.AtEndOfStream
WScript.Echo File.ReadLine
Loop
File.CloseOpenTextFile でテキストファイルを開き、ReadLine で1行ずつ読み込んでいます。
AtEndOfStream を使用することで、ファイルの最後まで処理できます。
2.テキストファイルに記載したコマンドを実行する
実際にテキストファイルに記載したコマンドを実行します。
今までの処理にプラスして、VBSから一時的なバッチファイルを作成して、読み込んだコマンドを実行していきます。
Option Explicit
Dim FSO
Dim WS
Dim InputFile
Dim TempBat
Dim Line
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set WS = WScript.CreateObject("WScript.Shell")
'コマンドを記載したテキストファイル
Set InputFile = FSO.OpenTextFile("C:\hogehoge\hoge.txt", 1)
'一時バッチファイルを作成
Set TempBat = FSO.CreateTextFile("C:\hogehoge\temp.bat", True)
'テキストファイルの内容をバッチファイルへ書き込む
Do Until InputFile.AtEndOfStream
Line = InputFile.ReadLine
TempBat.WriteLine Line
Loop
InputFile.Close
TempBat.Close
'バッチファイルを実行
WS.Run "C:\hogehoge\temp.bat", 1, True
'一時バッチファイルを削除
FSO.DeleteFile "C:\hogehoge\temp.bat"
Set TempBat = Nothing
Set InputFile = Nothing
Set WS = Nothing
Set FSO = Nothing
MsgBox "コマンドの実行が完了しました。"このVBSでは、以下の処理を順番に実行しています。
hoge.txtを開く- テキストファイルを1行ずつ読み込む
- 読み込んだ内容を一時的な
temp.batに書き込む temp.batを実行する- バッチファイルの実行完了を待つ
temp.batを削除する- 処理完了のメッセージを表示する
5.実行するファイルの構成
今回は以下のようにファイルを配置します。
C:\hogehoge\
├─ execute.vbs
└─ hoge.txt
hoge.txt には以下を記載します。
cd C:\work
echo test > test.txtexecute.vbs を実行すると、VBSによって一時的に以下のファイルが作成されます。
※実際にVBSを実行するとわかりますが、一瞬すぎて temp.bat があったかどうかは肉眼では確認が難しいです。
C:\hogehoge\
├─ execute.vbs
├─ hoge.txt
└─ temp.bat
その後、temp.bat が実行され、処理が完了すると temp.bat が削除されます。
最終的には、以下のような状態になります。
C:\hogehoge\
├─ execute.vbs
├─ hoge.txt
└─ test.txt
6.SendKeysを使用する方法について
VBSでは WScript.Shell の SendKeys を使用して、キーボード操作を自動化することもできます。
例えば、以下のように記述すると、Ctrl + A、Ctrl + C、Ctrl + V、Enter などのキー操作を自動実行できます。
WS.SendKeys "^a"
WS.SendKeys "^c"
WS.SendKeys "^v"
WS.SendKeys "{ENTER}"今回のような処理でも、テキストファイルを開いて内容をコピーし、コマンドプロンプトへ貼り付ける方法として SendKeys を利用できます。
ただし、SendKeys は現在アクティブになっているウィンドウに対してキー入力を送信します。
そのため、VBSの実行中に別のアプリケーションをクリックすると、意図しないアプリケーションにキー入力が送られる可能性があります。
また、処理途中で別のアプリケーションが起動した場合にも、想定外の動作になる可能性があります。
そのため、今回のように、テキストファイルを読み込んでバッチファイルとして実行する方法がおすすめです。
7.まとめ
今回は、VBSを使ってテキストファイルに記載したコマンドをコマンドプロンプトで実行してみました。
ポイントは以下のとおりです。
FileSystemObjectでテキストファイルを読み込む- テキストファイルの内容を一時的なバッチファイルへ書き込む
WScript.ShellのRunでバッチファイルを実行する- 実行が完了したら一時ファイルを削除する
VBSからコマンドプロンプトを操作したい場合、SendKeys を利用する方法もありますが、アクティブウィンドウに依存するため注意が必要です。
単純に決まったコマンドを実行するだけであれば、VBSからバッチファイルを直接実行する方法もあります。
用途に応じて、VBS、バッチファイル、PowerShellを使い分けると、Windows上の定型作業を効率化できます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
本記事では、VBS(Visual Basic Script)を使ってテキストファイルのコマンドを自動でコピー → コマンドプロンプトに貼り付けて実行する方法を解説します。
特に、定型的なコマンドをスクリプト化して自動化したい方、手入力を減らして作業効率を上げたい方に役立つ内容です。
1.準備
今回は以下の処理を実行します。
C:\hogehoge\hoge.txtに記載されたコマンドをVBS経由で読み取り、コマンドプロンプトへ自動貼り付け・実行- コマンド実行後、自動でコマンドプロンプトとテキストファイルを閉じる
今回は分かりやすいように、複製されるファイルと同じフォルダにvbsファイルを置いて実行しています。
1-1.実行したいコマンドを記載するテキストファイル
今回コピーするテキストファイル「hoge.txt」には以下の内容を記載しています。
hogehoge
hogehoge02
hogehoge03
hogehoge04
cd ..
2.VBSスクリプトと解説
今回実行する vbsスクリプトです。
' WScript.Shellオブジェクトを生成
Dim WS
Set WS = WScript.CreateObject("WScript.Shell")
' hoge.txt を開いて内容を選択・コピー
CreateObject("Shell.Application").ShellExecute "C:\hogehoge\hoge.txt"
WScript.Sleep 2000
WS.SendKeys "^a"
WScript.Sleep 2000
WS.SendKeys "^c"
WScript.Sleep 2000
' コマンドプロンプトを起動
WS.Run("cmd.exe")
WScript.Sleep 2000
' クリップボードの内容を貼り付けて実行
WS.SendKeys "^v"
WScript.Sleep 2000
WS.SendKeys "{ENTER}"
WScript.Sleep 2000
' コマンドプロンプトを閉じる
WS.SendKeys "exit"
WScript.Sleep 2000
WS.SendKeys "{ENTER}"
WScript.Sleep 2000
' メモ帳をアクティブにして閉じる(Alt+F4)
WS.AppActivate "notepad"
WScript.Sleep 2000
CreateObject("WScript.Shell").SendKeys "%{F4}"
WScript.Sleep 2000
3.動作確認(実行結果)
上記のスクリプトを実行した結果です。
まず「hoge.txt」が開かれます。

次に「hoge.txt」の内容がすべてコピーされます。

コピーされたあとはコマンドプロンプトが起動します。

コピーされた「hoge.txt」の内容がコピーされコマンドプロンプトにペーストされコマンドが実行されます。
今回はテキスト内の最後に階層移動の[cd]コマンドを記載しているため、cdコマンドが正常に実行されることで、コピーした内容がコマンドプロンプト上で正常に動作するということも確認できました。

最後にコマンドプロンプトとメモ帳(hoge.txt)を閉じます。

4.実行する上での注意点
vbsの処理はGUI上で実行され、アクティブなアプリに対して処理を実行していきます。
なので実行途中に他のアプリを触る(例えばブラウザやデスクトップをクリックする)など、処理しようとしているアプリ以外のものをアクティブとしてしまうと、アクティブにしたアプリに対してコマンドが実行されてしまい、想定外の挙動になることがあるので注意が必要です。

似たような観点で、もしコマンドプロンプトで実行したコマンドが別のアプリを開く場合には、その開いたアプリでのコマンド実行となってしまうので注意が必要です。


