某PCショップ店員の覚書

勤務中に作成したプログラムやスクリプトのまとめ

Auto Gaming Setting Tool をアップデートした件 -ver1.1.1

Auto Gaming Setting Toolのバージョンアップを行いました。

github.com

バージョンアップ内容

  • スタートメニューの表示方法を変更
  • XBox Game Barの無効化
  • 固定キーの無効化
  • Windowsで表示される広告の無効化
  • タスクバーアイコンの表示位置変更
  • 管理者権限で実行されているか表示する

バグの修正

  • 常に最前面に表示されてしまうバグを修正しました

既知のバグ

  • ありません。

追加予定の機能

  • アイディアが浮かばないのでアイディアを募集しています。

Screen Shot

  • not 管理者

  • 管理者

  • 実行結果

.ps1スクリプトをGUI化してついでに.exe化もした件

最近、私が個人的に作ったps1スクリプトを身内向けに配布することになったのでスクリプトGUI化しました。

自動設定開始ボタンをクリックするとテキストボックスに処理内容が出力されるおまけ付き。

ついでにGitHubにも公開したので、誰でもダウンロードできるようしました。
github.com
ページ右側にある「Release」から現在公開されている一番最新の物をダウンロードしてお使いください。

続きでコードと超雑な解説。

続きを読む

PowerShellのプロファイルに色々書いた件

PowerShellのプロファイルに色々書いてみました。

プロファイルの編集方法は下記のページを参照してください。
tech.guitarrapc.com




・プロファイルを編集する自作関数

Function edit_profile{
    <#
    .SYNOPSIS
        PowerShell プロファイルを編集する
    .DESCRIPTION
        メリット:VS Codeの実行パスと$profile変数を直接叩く必要がなくなる
    .EXAMPLE
        PS C:\Sample> edit_profile()
    #>
    Start-Process "C:\Users\[UserName]\AppData\Local\Programs\Microsoft VS Code\Code.exe" $profile
}

・管理者権限で実行しなおす自作関数

Function elev_admin($scriptpath){
    <#
    .SYNOPSIS
        管理者権限で実行しなおす
    .PARAMETER $scriptpath
        スクリプト本体のパス。$PSCommandPath で取得&渡し可能。
    #>
    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")){
        Start-Process powershell.exe "-File `"$scriptpath`"" -Verb RunAs
        exit
    }
}

・「ファイルを開く」ダイアログを表示する自作関数

Function OpenFile(){
    <#.SYNOPSIS
        ファイルを開く ダイアログを表示する
    .OUTPUTS
        選択したファイルのファイル名+フルパス
        選択しなかった場合は文字列"Error"
    #>

    $current_directory = Get-Location

    # アセンブリのロード
    Add-Type -AssemblyName System.Windows.Forms

    # ダイアログインスタンス生成
    $dialog = New-Object Windows.Forms.OpenFileDialog

    # タイトル ファイルのフィルタ 初期ディレクトリ
    $dialog.Title = "ファイルを選択"
    $dialog.Filter = "すべてのファイル(*.*)|*.*"
    $dialog.InitialDirectory = "$current_directory"

    # ダイアログ表示
    $result = $dialog.ShowDialog()

    # [開く]ボタン押下ならファイル名のフルパスを返す
    if($result -eq "OK"){
        Return $dialog.FileName
    } else {
        Return "Error"
        break
    }
}

XMLを読み込む自作関数(OpenFile関数と併用する前提)

Function Get-XML($filepath){
    <#
    .SYNOPSIS
        XMLファイルを読み込む
    #>
    $XML = [XML](Get-Content $filepath)
    
    Write-Host "型の確認"
    $XML.GetType()
    Write-Host ""
}

・エクセルファイルをPDFに変換する

Function xls_to_pdf($filepath){
    <#
    .SYNOPSIS
        エクセルファイルをPDF化する
    .PARAMETER filepath
        エクセルファイルのフルパス
    #>
    try{
        $excel = New-Object -ComObject Excel.Application
        $excel.Visible = $false
        $excel.DisplayAlerts = $false

        $wb = $excel.Workbooks.Open($filepath)

        $pdfpath = (Get-Item $filepath).BaseName
        $pdfpath += ".pdf"

        $wb.ExportAsFixedFormat(0, $pdfpath)

        $wb.Close()

        $excel.Quit()
    }
    finally{
        $sheet, $wb, $excel | ForEach-Object {
            if($_ -ne $null){
                [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($_)
            }
        }
    }
}

上記全てをプロファイルに記述すれば、いつでも自作関数として呼び出せます。
個人的にはOpenFile等は利便性も使用頻度も高いので特にオススメです。

VS Codeで作った.ps1スクリプトがPowerShell ISEで開くと文字化けしたり、そもそも実行できない件

今までPowerShellスクリプトを組む際はPowerShell ISEを使ってコーディングしていましたが普段他の言語でコーディングする際はVS Codeを使っているのでPowerShellもそちらに乗り換えました。
ただ、PowerShell ISEを使って作成したスクリプトは何の問題もなく実行できますが、VS Codeで作成したスクリプトは何故か実行してもコンソールが一瞬で閉じてしまう現象に襲われていました。
色々調べた結果、PowerShell ISEはShift-JISでスクリプトが保存されるのに対し、VS CodeUTF-8のBOM無しで保存されてしまうのが原因でした。

別に「"」で囲まれた文字列が文字化けするだけなら大きな問題ではないんですが、「"」が文字化けしてしまうと大変なことになります。
こんな感じ↓ (いつぞや解説したAuto Gaming Setterのスクリプト)

###########################################################################
# VC Runtime縺ョ繧、繝ウ繧ケ繝医・繝ォ
###########################################################################
$TotalProgress = 7
$denominator = "/"+[string]$TotalProgress
Write-Host "-----------------------------------------------------------------"
Write-Host "Process " -NoNewline ; Write-Host "1" -NoNewline -ForegroundColor Red ; Write-Host "/" -NoNewline ; Write-Host "5" -ForegroundColor Green
Write-Host "VC Runtime縺ョ繧、繝ウ繧ケ繝医・繝ォ" -ForegroundColor Green

Write-Host "VC Runtime 2005 - 2019縺セ縺ァ縺ョ繧ゅ・繧偵う繝ウ繧ケ繝医・繝ォ縺励∪縺吶・

Write-Host "2005..."
Start-Process -Wait -FilePath "$ScriptDir\Data\VC_Runtimes\vcredist2005_x86.exe" /q
Start-Process -Wait -FilePath "$ScriptDir\Data\VC_Runtimes\vcredist2005_x64.exe" /q

見てわかる通り、「Write-Host "VC Runtime 2005 - 2019縺セ縺ァ縺ョ繧ゅ・繧偵う繝ウ繧ケ繝医・繝ォ縺励∪縺吶・」が文字化けしてしまっている所為でWrite-Host以下の処理も文字列として扱われてしまっています。
これを解決するためにはVS Code側でShift-JISとして保存するか、BOM有りのUTF-8として保存する必要があります。

VS Code ウィンドウ下部にある「UTF-8」をクリック

エンコード付きで保存」をクリック

UTF-8 with BOM」をクリック

以上です。

......そもそもPowerShell本体がShift-JISじゃなくてUTF-8 BOM有り無しに対応してくれればこんなことにはならないんですけどね。