某PCショップ店員の覚書

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

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等は利便性も使用頻度も高いので特にオススメです。