配信に必要なソフトを一括で起動するPowerShellスクリプトを作ってみた

気が向いたときにTwitchでゲーム配信をしたりしなかったりしています。

配信のために必要なソフト…そう、まずはOBSですね。
あと、コメントを読み上げるためのソフトもあります。
コメントを翻訳してくれるソフトもあります。
自分のマイク入力音声を字幕表示&翻訳してくれるソフト(というかWebサイト)もあります。
それと…あれもこれも…

…地味に多い。

フォルダにショートカットを纏めたものの、1個1個上から順にクリックしていくのは微妙に手間です。あと、これは職業病かもしれませんが「人間が操作をする」という行為にはいつか必ずミスが発生するよ!という思想(?)が強迫観念として叩き込まれています。

まぁ私が配信の設定をミスったところで特に問題は無いのですが、1つづつアイコンをポチポチするのを面倒に思っていたのは確かです。というわけで必要なソフトを一括で起動できるスクリプトを作ろう!と思い立ちました。

最初はバッチスクリプト(bat)で作ろうと思ったのですが、ヤツはちょっと凝ったことをしようとすると保守性が著しく低下します(後で見返したとき意味がわからなくなりがち)。

じゃあPowerShellで作ろう!…となったのですが、普段PowerShellはあまり使わないので基本的な構文がうろ覚えです。仕事でもないのにそんなのちまちま調べて書いてられません。というわけでカモン!ChatGPT!

まずは大本の関数として「指定プロセスが起動していなかったら、起動する」というものを作ります(作ってもらいます)。

function Start-ProgramIfNotRunning {
    param (
        [string]$programPath
    )

    # プログラムがすでに実行中かどうかを確認
    $existingProcess = Get-Process | Where-Object { $_.MainModule.FileName -eq $programPath }

    if ($existingProcess -eq $null) {
        # プロセスが存在しない場合、プログラムを起動
        Start-Process -FilePath $programPath
        Write-Host "プログラムが起動しました."
    } else {
        # プロセスがすでに存在する場合はスキップ
        Write-Host "プログラムはすでに起動中です."
    }
}

# 任意のプログラムのパスを指定して関数を呼び出す例
Start-ProgramIfNotRunning -programPath "C:\Path\To\Your\Program.exe"

はい、できました!AIバンザイ!
あとはこの関数の呼び出し処理を追加していけば完成…と思いきや、色々と問題が発生したので、手直ししていきます。

#********************************************************
# 指定プロセスが起動中でなければ起動する
#********************************************************
function Start-ProgramIfProcessNotRunning {
    param (
        [string]$processName,               #起動中チェックに使用するプロセス名
        [string]$programPath,               #起動するプログラムのフルパス
        [string]$workingDirectory = $null,  #(オプション)作業ディレクトリを別途指定する
        [bool]$isOutputRedirect = $false    #(オプション)標準出力・標準エラー出力などが邪魔になるものは$trueを指定(適当なファイルに捨てます)
    )

    # プロセスがすでに実行中かどうかを確認
    $existingProcess = Get-Process -Name $processName -ErrorAction SilentlyContinue

    if ($existingProcess -eq $null) {
        # プログラムの作業ディレクトリが未指定の場合、プログラムのディレクトリを使用
        if (-not $workingDirectory) {
            $workingDirectory = (Get-Item $programPath).Directory.FullName
        }

        # プロセスが存在しない場合、プログラムを起動
        if ( $isOutputRedirect ){
            Start-Process -FilePath $programPath -WorkingDirectory $workingDirectory -RedirectStandardOutput "stdout.txt" -RedirectStandardError "stderr.txt"
        } else {
            Start-Process -FilePath $programPath -WorkingDirectory $workingDirectory 
        }
        
        Write-Host $processName "が起動しました."
    } else {
        # プロセスがすでに存在する場合はスキップ
        Write-Host $processName "はすでに起動中です."
    }
}

…はい、修正版はこちら。
起動するためのファイル名と実際に起動されるプロセス名が異なる場合もあれば(VTubeStudio対応)、作業ディレクトリの指定(OBS対応)、標準出力を適当なファイルに捨てる(VoiceBox対応)…などなど、後から雑に処理を付け加えたらこんな感じになりました。まぁ細かいことはいいのよ。仕事じゃないし。

さて、問題は「音声認識字幕ちゃん」です。
これはWindows上で起動するプログラムではなく、Webサイト上で利用するタイプのものです。しかし起動(Webサイトを開く)はbatファイルから行います。ちょっと特殊なパターンなので、chromeで指定タイトルのサイトを開いているかの確認を行うだけにとどめておきます。

#********************************************************
# chromeで指定タイトルのウィンドウを開いているかチェック
#********************************************************
function Check-ChromePageOpened {
    param (
        [string]$targetTitle        #チェック対象タイトル文字列(部分一致)
    )

    # Chromeのプロセスを取得
    $chromeProcesses = Get-Process | Where-Object { $_.ProcessName -eq "chrome" }

    # Chromeの各ウィンドウを調べる
    foreach ($process in $chromeProcesses) {
        # Chromeウィンドウのタイトルを取得
        $windowTitle = $process.MainWindowTitle
        
        # タイトルに指定したURL(title)が含まれているか確認
        if ($windowTitle -like "*$targetTitle*") {
            return $true
        }
    }

    # URLが開かれていない場合
    return $false
}

字幕ちゃん1人のために凝った関数作ってられません。これで妥協!

あとはこれらをくっつけて、呼び出し処理を追加して完成!!!

ところで、PowerShellスクリプトはセキュリティ的な理由でWindowsさんは簡単に(=ダブルクリックで)実行させてくれないんです。回避方法は色々あるのですが、とりあえず今回はbatスクリプトを経由させることにしました。

powershell.exe -ExecutionPolicy RemoteSigned %~dp0start_all_softwares.ps1

このbatファイルをダブルクリックすれば、配信に必要なソフトがババババッ!と起動されます。

「あれは起動してたかな?あ、忘れてた!」というバタバタも無くなり、億劫だった配信準備も少し気が楽になりました。

ところで、世の中には登録しておいた一連のソフトをボタン一発で起動できる便利な機材があるそうですね?

Stream deckねぇ…ふーん…

(おしまい)


なんとなくスクリプト全体を大っぴらに公開するのは気が引けるので、有料エリアに隠しておきます。
ちょっと知識のある人ならここまでの情報だけで構築できます。スクリプト全体見たからと行って、そのままあなたの環境で実行できる保証はできません。

まぁなんていうか、こういうものにお金払ってくれる人がいるのかな…という好奇心が一番なのですが。

ここから先は

3,045字

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?