見出し画像

GoProのファイル名をリネームするプログラムを、ChatGPTに作ってもらった話

割引あり

はじめに

GoProの命名規則は本当に不可解。そこで、今まではこのサイトを参考にファイル名を変更していたのだが、PCを新調した関係でWindows11になってしまい、このプログラムが動作しなくなってしまった。
しゃーなし、プログラムを改変するかー、などと思っていたが、ふと思い立ってChatGPTに相談してみたらあっという間に解決したので、記録として残してみることにする。
使えれば顛末などどうでもいいという人は、下記の実際のコード以降の欄を参照してください。

GoProのファイル名

GoProのファイル名は下記の通り。ほんとにプログラマーが書いたのか?こういう命名規則にするインセンティブが本当にわからない。教えて偉い人。

とにかく開発者の正気を疑う命名規則

これの何が問題かというと、上記の例の場合の1234番の動画の前半と後半が名前順ソートで遥か彼方に離れ離れになってしまうことだ。
なんで?いやマジでなんで???

ファイル名のリネーム

というわけで整理したいわけだが、当然手動でちまちま作業などできない。仕事でプログラミングもしている者のはしくれとして、こんなことは人間のすることではない、と以前ググったところ、下のようなサイトをみつけた。

非常にありがたい。というわけでしばらく活用させていただいていたのだが、移住に伴いパソコンを新調し否応なくWindows11になったことで、このプログラムが動作しなくなってしまった。

やむなく自分でスクリプトを書こうかと思ったのだが、LE0はVBScriptがわからぬ。LE0は一回の研究者である。ダウンロードした、他人のコードでやり過ごしてきた。
まずはVBScriptを調べようかと思ったところで、GoogleではなくChatGPTにアクセスすることを思いついた。しかもどうせ聞くなら、コードの読み方ではなく、使えるコードを聞いてしまおう。ということで質問してみた。

ChatGPT大先生

いかにやり取りの一部を引用する。実際に使える形になったコードは最後に公開する。なおChatGPTは無課金である。ので、現時点 (2023年5月末) では3.5である。

LE0「下記のコードがWindows10では動くのにWindows11では動きません。どのように修正すればよいか教えてください。(コード貼り付け)」

Windows 11では動作しない理由は明確ではありませんが、おそらくVBScriptの一部の機能がWindows 11でサポートされなくなったことが原因です。VBScriptはWindows 11で非推奨とされており、代替の方法を使用することが推奨されています。

このプログラムを修正してWindows 11で動作するようにするには、VBScriptの代わりに別のプログラミング言語(例:PowerShell、Python、またはVB.NET)を使用する必要があります。以下に、同様の機能を持つPowerShellスクリプトの例を示します。

```
(コード略)
```

上記のPowerShellスクリプトは、VBScriptスクリプトと同様の機能を提供します。スクリプトファイル(拡張子.ps1)として保存し、PowerShellで実行することができます。Windows 11で動作するはずです。

このスクリプトは、VBScriptスクリプトと同じファイル名のパターンを持

つファイルをリネームします。実行する前に、リネームされるファイルのリストを表示し、実行の確認を求めます。

注意:PowerShellスクリプトを実行するには、適切な実行ポリシーが必要です。適切な実行ポリシーを設定するか、スクリプトを実行する際にポリシーをバイパスする必要がある場合があります。

ChatGPT

というわけで言われた通り実行してみたものの、エラーを吐いた。エラーコードを何度か送り付けて修正させたが、同様のエラーを吐き続けている。ChatGPTいわく文字コードの問題のようなので、そもそも日本語が入っているのが原因かも?と思い下記のように依頼した。
LE0「日本語部分を英訳して代替コードを作成してください。」

申し訳ありませんでした。以下に、日本語部分を英訳した修正済みのスクリプトを示します。

```
(コード略)
```

修正済みのスクリプトを使用してみてください。このスクリプトは、日本語部分を英訳したものですので、正しく動作するはずです。お手数をおかけしましたが、ご確認ください。

ChatGPT

これで晴れて動くコードが完成した (実際はファイルの指定などでもう少し調整があったが)。

実際のコード

変換用 (Rename.ps1)

$TITLE = "GoPro Video Renamer"

function Convert-Name {
    param(
        [string]$Path,
        [switch]$DoRename
    )

    $folder = Get-Item $Path

    if ($folder -is [System.IO.DirectoryInfo]) {
        $files = Get-ChildItem -Path $folder.FullName -File
    }
    else {
        Write-Host "Invalid folder path." -ForegroundColor Red
        return
    }

    foreach ($file in $files) {
        $parentFolderName = $file.DirectoryName
        $fileName = $file.Name
        $baseName = [System.IO.Path]::GetFileNameWithoutExtension($file.FullName)
        $extensionName = [System.IO.Path]::GetExtension($file.FullName)

        $regexPattern = "(G.)(\d{2})(\d{4})"
        if ($baseName -match $regexPattern) {
            $afterFileName = [regex]::Replace($baseName, $regexPattern, '$1$3-$2') + $extensionName  # Renamed file name
            if ($DoRename) {
                Rename-Item $file.FullName -NewName $afterFileName -Force  # Execute rename
            }
            Write-Host "$fileName → $afterFileName" -ForegroundColor Green  # Display result
        }
        else {
            Write-Host "$fileName → Not applicable." -ForegroundColor Red  # Display result
        }
    }
}

$folderPath = Read-Host "Enter the folder path:"
if (-not (Test-Path $folderPath)) {
    Write-Host "Invalid folder path." -ForegroundColor Red
    exit
}

Convert-Name -Path $folderPath

$res = Read-Host "`nRename the files as shown above. Do you want to proceed? (Y/N)"

if ($res.ToUpper() -eq "Y") {
    Convert-Name -Path $folderPath -DoRename
    Write-Host "`nThe files have been renamed as shown above." -ForegroundColor Cyan
}
else {
    Write-Host "Operation cancelled." -ForegroundColor Yellow
}

逆変換 (ReverseRename.ps1)

$TITLE = "GoPro Video Reverse Renamer"

function Convert-Name {
    param(
        [string]$Path,
        [switch]$DoRename
    )

    $folder = Get-Item $Path

    if ($folder -is [System.IO.DirectoryInfo]) {
        $files = Get-ChildItem -Path $folder.FullName -File
    }
    else {
        Write-Host "Invalid folder path." -ForegroundColor Red
        return
    }

    foreach ($file in $files) {
        $parentFolderName = $file.DirectoryName
        $fileName = $file.Name
        $baseName = [System.IO.Path]::GetFileNameWithoutExtension($file.FullName)
        $extensionName = [System.IO.Path]::GetExtension($file.FullName)

        $regexPattern = "(G.)(\d{4})-(\d{2})"
        if ($baseName -match $regexPattern) {
            $afterFileName = [regex]::Replace($baseName, $regexPattern, '$1$3$2') + $extensionName  # Renamed file name
            if ($DoRename) {
                Rename-Item $file.FullName -NewName $afterFileName -Force  # Execute rename
            }
            Write-Host "$fileName → $afterFileName" -ForegroundColor Green  # Display result
        }
        else {
            Write-Host "$fileName → Not applicable." -ForegroundColor Red  # Display result
        }
    }
}

$folderPath = Read-Host "Enter the folder path:"
if (-not (Test-Path $folderPath)) {
    Write-Host "Invalid folder path." -ForegroundColor Red
    exit
}

Convert-Name -Path $folderPath

$res = Read-Host "`nRename the files as shown above. Do you want to proceed? (Y/N)"

if ($res.ToUpper() -eq "Y") {
    Convert-Name -Path $folderPath -DoRename
    Write-Host "`nThe files have been renamed as shown above." -ForegroundColor Cyan
}
else {
    Write-Host "Operation cancelled." -ForegroundColor Yellow
}

使用方法

  1. 上記のコードそれぞれに適当な名前を付けて適当な場所に保存する。拡張子は.ps1とする。

  2. 右クリックし、"power shellで実行" する。

  3. ファイルパスを求められるので、入力してEnter。フォルダを入力すると、フォルダ内のすべてのファイルを一括で変更できる。

  4. 変更されるファイルの名前と変更後の名前の一覧が表示されるので、確認し、yで実行する。

まとめ

というわけで、Power Shellなどほとんど触ったことのない私でも、簡単にリネームソフトを作ることができた。ChatGPTさまさまである。
やはり今の時代、求められているのは細かい実務ではなく、AIを活用できる素養なのだろう。昨今のAI論に関してもいろいろと思うところはあるが、これについてはいずれ別記事に書く…かもしれない。

本文は以上ですが、例によって募金用の課金枠を用意しておきますので、参考になったので応援したいという奇特な方はどうぞよろしくお願いいたします。

ここから先は

21字

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