会社員に絶対役立つプログラムコード(プログラミング知識ゼロでできる)

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

仕事効率化

はじめに

こんにちは!制作ディレクターのくらゆーです!

今回の記事では、ChatGPTを活用してPowerShellの簡単かつ迅速にコードを作成する方法を紹介します。これは、プログラミングの知見がゼロの方でもすぐに挑戦でき、コードを自然な文章で書くことができます。また、この方法のメリットについても解説していきます。

PowerShellって何?

まずは、PowerShellとは何かを紹介します!PowerShellは、Windows上で使用できるコマンドラインシェルとスクリプト言語です。要は特別なダウンロードやインストールとか不要でWindowsでデフォルトで入っているものです。このPowerShellを使うことで、Windows上で実行される多くのタスクを自動化することができます。これはセキュリティの完備されている会社員の方でも実行しやすいので要チェックです!!

ChatGPTって何?

ChatGPTは、OpenAIが開発した自然言語処理モデルです(https://openai.com/blog/chatgpt)。ChatGPTを使うことで、プログラミングの言語を知らなくても、自分が実現したいことをきちんと伝えることで適切なコードを生成することができます。これによって、PowerShellコマンドの作成が初めての方でも、簡単にコードを書くことができます。(言ってしまえばPowerShellでなくてもJavaやPythonでも何でも書いてくれます)

ChatGPTでPowerShellコードを作成する方法

では、さっそくChatGPTを使ってPowerShellコードを作成する方法を紹介します!手順は以下の通りです。

ChatGPTを使ったPowerShellコードの生成手順

ChatGPTにPowerShellコマンドや処理の例文を入力します。すると回答する形で ChatGPTが自然な文章でPowerShellコードを生成してくれます。 生成されたコードをテキストエディタにコピーし、必要な修正を加えます。これをPowerShellにペーストしてプログラムを実行します。すんなり思い通りに進むこともあれば、途中でエラーになることもあります。しかし、ここが分かれ道で、「やっぱりAIってまだまだなんだな~」と手を止めてしまえばそのままです。間違っていることをエラーコードとともに返信という形でフィードバックしてあげれば、修正したコードを生成してくれます。対話型なので、間違っていることを素直に伝えれば修正案を出してくれます。もちろんその修正案がまだ完璧でない場合もありますので、対話を続けながら詰めていく、または別のアプローチで自分が欲している回答まで辿り着かせることがポイントですね。

ChatGPTを使う際の注意点

ChatGPTを使う際には、以下の注意点があります。

・生成されたコードが正しいかどうかを確認する必要がある。

・生成されたコードには誤りが含まれる可能性がある。

・生成されたコードは、あくまでもベースとして使用し、必要な修正を加える必要がある。

・間違っている、または思っているものと違う場合はフィードバックしてあげる必要がある。

ChatGPTを使うメリット

ChatGPTを使うことで、以下のようなメリットがあります。

簡単かつ迅速なPowerShellコードの作成

ChatGPTを使うことで、自然な文章でPowerShellコードを簡単かつ迅速に生成することができます。手作業でコードを作成するよりも効率的にコードを作成できます。また、ネットで調べれば出てくるじゃないか、という意見はあるかもしれませんが、結構ニッチで緻密なところまで書き出してくれるのと、やはり会話の中で本当に実現したいことを見出してくれるのは対話型のAIならではだと思います。エラーが起きた時にフィードバックすれば代替案をすぐに書き直してくれるというのは、ネット検索よりよっぽど早く自分の実現したいことに辿り着けますね。

コードの可読性

ChatGPTが生成したコードは、自然な文章で記述されているため、可読性が向上します。また、必要に応じて、生成されたコードに必要な修正を加えることができます。「変数」としておくことで転用がしやすいです。また、そのように対話を繰り返しながらコードを書いてくれるのでプログラミングが苦手な方でもすぐにとっかかれますね。

くらゆー

僕もプログラミング言語は全くわからないです。でもChatGPTを使うことで実現させたいコードをサクサク書いてもらえてます。

新しいPowerShellコマンドの習得

ChatGPTを使うことで、新しいPowerShellコマンドを習得することができます。ChatGPTが生成したコードを読むことで、新しいコマンドの使い方を学ぶことができます。

プログラミング初心者にとっても使いやすい

ChatGPTを使うことで、プログラミング初心者でもPowerShellコードを簡単に作成することができます。自然言語でコードを書くことができるため、プログラマーでなくても簡単にコードを作成することができます。

コピペですぐ使える!コードの実例!パクってください!!

実践の場で活用できるようになったコードを抜粋して紹介します(今後この記事で拡充していきます)

これらは、一発で思い通りのものが生成できなかったものもあり、フィードバックを繰り返しながらできるようになったものたちです。

★任意フォルダ&サブフォルダ内のWord(.docおよび.docx)をpdfに一括変換※変更履歴コメント無し

# 検索するフォルダのパスを指定
$folder_path = "任意の場所のパスを指定"

# WordをPDFに変換する関数を定義
function ConvertTo-PDF {
    param(
        [string]$file_path
    )

    $wdFormatPDF = 17
    $word = New-Object -ComObject Word.Application
    $word.Visible = $false

    try {
        $doc = $word.Documents.Open($file_path, $false, $true)
        $pdf_path = $file_path -replace '\.docx?', '.pdf'

        # 変更履歴やコメントを非表示にする
        $doc.ActiveWindow.View.ShowRevisionsAndComments = $false

        $doc.SaveAs([ref] $pdf_path, [ref] $wdFormatPDF)
    } finally {
        $doc.Close($false)
        $word.Quit()
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($doc) | Out-Null
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
        Remove-Variable doc, word -ErrorAction SilentlyContinue
    }
}

# フォルダ内のすべてのWordファイルを再帰的に検索
$files = Get-ChildItem $folder_path -Recurse -Include *.doc,*.docx

# 各WordファイルをPDFに変換
foreach ($file in $files) {
    # Wordの変更履歴を削除
    $document = New-Object -ComObject Word.Application
    $document.Visible = $false
    $doc = $document.Documents.Open($file.FullName)
    $doc.AcceptAllRevisions()
    $doc.TrackRevisions = $false
    $doc.Save()
    $doc.Close()
    $document.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($doc) | Out-Null
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($document) | Out-Null
    Remove-Variable doc, document -ErrorAction SilentlyContinue

    # WordファイルをPDFに変換
    ConvertTo-PDF $file.FullName
}

Write-Host "WordファイルをPDFに変換しました。"

★任意フォルダ&サブフォルダ内のWord(.docおよび.docx)をRTF形式に変換

$FolderPath = "任意の場所のパスを指定"
$Filter = "*.docx","*.doc"
$Files = Get-ChildItem -Path $FolderPath -Recurse -File -Include $Filter

$Word = New-Object -ComObject Word.Application

ForEach ($File in $Files) {
    $RtfFile = $File.FullName -replace "\.docx$|\.doc$", ".rtf"
    $Doc = $Word.Documents.Open($File.FullName)
    $Doc.ShowComments = $false
    $Doc.SaveAs([ref] $RtfFile, [ref] 6)
    $Doc.Close()
}

$Word.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Word) | Out-Null
Remove-Variable -Name Word

★任意フォルダ&サブフォルダ内のPDFを全て削除

# 処理したいフォルダのパスを指定する
$folderPath = "任意の場所のパスを指定"

# フォルダ内のPDFファイルを再帰的に検索して、削除する
Get-ChildItem -Path $folderPath -Recurse | Where-Object { !$_.PSIsContainer -and $_.Extension -eq ".pdf" } | ForEach-Object {
    Remove-Item $_.FullName
}

★任意フォルダ&サブフォルダ内Word(.docおよび.docx)のヘッダーの表内のX列X行の画像を削除する

# Word COMオブジェクトを作成する
$word = New-Object -ComObject Word.Application

# Wordアプリケーションを非表示にする
$word.Visible = $false

# Wordをバックグラウンドで実行するための設定を追加
$word.AutomationSecurity = '3'

# 変更前の文字列と変更後の文字列を指定します。
$old_string = ".docx?"
$new_string = ".pdf"

# 対象フォルダ内のすべての.docおよび.docxファイルを再帰的に検索
$folder_path = "任意の場所のパスを指定"
$file_list = Get-ChildItem $folder_path -Recurse -Include "*.doc", "*.docx"

foreach ($file in $file_list) {
    # Wordドキュメントを開く
    $doc = $word.Documents.Open($file.FullName)

    # ドキュメントのすべてのセクションに対して処理を実行する
    foreach ($section in $doc.Sections) {
        # セクションのすべてのヘッダーに対して処理を実行する
        foreach ($header in $section.Headers) {
            # ヘッダー内のテーブルをすべて取得する
            $tables = $header.Range.Tables

            # テーブルが存在する場合は、1行目1列目のセル内の画像を削除する
            if ($tables.Count -gt 0) {
                $cell = $tables.Item(1).Cell(1,1)
                $shapes = $cell.Range.InlineShapes
                if ($shapes.Count -gt 0) {
                    foreach ($shape in $shapes) {
                        $shape.Delete()
                    }
                }
            }
        }
    }

    # 変更を保存してWordを閉じる
    $doc.Save()
    $doc.Close()
}

# Word COMオブジェクトを解放する
$word.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
Remove-Variable word

★任意フォルダ&サブフォルダ内Word(.docおよび.docx)のヘッダーの表内のX列X行に画像を挿入する

# 挿入する画像のファイルパス
$image_path = "挿入したい画像のパスを指定"

# 検索対象のフォルダパス
$search_path = "任意の場所のパスを指定"

# 検索対象の拡張子
$extensions = @(".doc", ".docx")

# Word オブジェクトの作成
$word_app = New-Object -ComObject Word.Application

# 検索対象のファイルを再帰的に取得
$file_list = Get-ChildItem $search_path -Recurse |
             Where-Object { $_.Extension -in $extensions }

# 各ファイルに対して処理を行う
foreach ($file in $file_list) {
    # ドキュメントを開く
    $doc = $word_app.Documents.Open($file.FullName)

    # ヘッダーのテーブルを取得する
    $table = $doc.Sections.Item(1).Headers.Item(1).Range.Tables.Item(1)

    # 表の最初のセルに画像を挿入する
    $cell = $table.Cell(1, 1)
    $cell.Range.InlineShapes.AddPicture($image_path)

    # ドキュメントを保存して閉じる
    $doc.Save()
    $doc.Close()
}

# Word オブジェクトを解放する
$word_app.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word_app) | Out-Null
Remove-Variable word_app

★任意のフォルダ内のファイル名をエクセルシートに転記

# エクセルオブジェクトを作成する
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true # エクセルを表示する場合はTrueに設定する
$workbook = $excel.Workbooks.Add()
$sheet = $workbook.Worksheets.Item(1)

# 処理したいフォルダのパスを指定する
$folderPath = "任意の場所のパスを指定"

# フォルダ内のファイルを再帰的に検索して、ファイル名をエクセルに書き込む
$row = 1
Get-ChildItem -Path $folderPath -Recurse | Where-Object { !$_.PSIsContainer } | ForEach-Object {
    $sheet.Cells.Item($row, 1) = $_.Name
    $row++
}

# ワークブックを保存し、エクセルを終了する
$workbook.SaveAs("任意の場所のパスを指定\FileNames.xlsx")
$excel.Quit()

★任意フォルダ&サブフォルダ内word内テキスト変換

# 変換対象の文字列と変換後の文字列を指定します。
$oldText = "変換前のテキスト"
$newText = "変換後のテキスト"

# Wordファイルを検索するフォルダを指定します。
$rootFolder = "任意の場所のパスを指定"

# Wordアプリケーションを開きます。
$word = New-Object -ComObject Word.Application
$word.Visible = $false

# フォルダ内のすべてのWordファイルに対してループを実行します。
Get-ChildItem $rootFolder -Recurse | Where-Object { $_.Extension -match ".docx*"} | ForEach-Object {
    # Wordドキュメントを開きます。
    $document = $word.Documents.Open($_.FullName)

    # ドキュメント内のすべてのRangeオブジェクトに対してループを実行します。
    $document.Range().Find.Execute($oldText, $false, $false, $false, $false, $false, $true, $false, $false, $newText, 2)

    # ドキュメントを保存して閉じます。
    $document.Save()
    $document.Close()
}

# Wordアプリケーションを終了します。
$word.Quit()

★任意フォルダ&サブフォルダ内word内テキスト変換(複数同時)

$FolderPath = "任意の場所のパスを指定" # 対象フォルダのパス
$OldTexts = @("変換前①","変換前②","変換前③","変換前④","変換前⑤") # 置換前のテキストの配列
$NewTexts = @("変換後❶","変換後❷","変換後❸","変換後❹","変換後❺") # 置換後のテキストの配列

# フォルダ内の全てのWord文書を検索
$files = Get-ChildItem -Path $FolderPath -Recurse -Include *.doc,*.docx | Where-Object { ! $_.PSIsContainer }

# 各ファイルを開き、置換を実行して保存する
foreach ($file in $files) {
    # Wordのインスタンスを作成し、ファイルを開く
    $word = New-Object -ComObject Word.Application
    $doc = $word.Documents.Open($file.FullName)

    # ドキュメントの全テキストを取得し、置換を実行する
    $range = $doc.Content
    foreach ($i in 0..($OldTexts.Count - 1)) {
        $range.Find.Execute($OldTexts[$i], $false, $true, $false, $false, $false, $true, 1, $false, $NewTexts[$i], 2)
    }

    # ファイルを上書き保存し、Wordを終了する
    $doc.Save()
    $doc.Close()
    $word.Quit()
}

まとめ

今回は、ChatGPTを活用してPowerShellコードを作成する方法とそのメリットについてご紹介しました。プログラミング初心者でも挑戦しやすく、自然な文章でコードを書くことができるため、効率的にコードを作成することができます。また、生成されたコードは可読性が高く、新しいPowerShellコマンドを習得することもできます。ChatGPTを使って、自分なりのPowerShellコードを作成してみてはいかがでしょうか?カスタマイズのやりようは無限大です!

コメント