Lesson 16

実践2:ファイル名を一括で変更できるツールを作成する

Lesson 16 Chapter 1
実践2:ファイル名を一括で変更できるツールを作成する

このレッスンでは、PowerShellスクリプトを作成して、指定されたディレクトリ内のファイル名を一括で変更するツールを作成します。

たとえば、以下のような場合にファイル名を一括で変更できるツールを作成する必要が出てきます。

  1. ファイル名の統一: 複数のファイルがある場合、命名規則が一定でないと管理が困難になります。このような場合、ファイル名を一括で変更して統一性を持たせることができます。
  2. ファイルの整理: ファイルが増えたり、変更されたりすると、ファイル名が不適切になることがあります。このような場合、一括でファイル名を変更して整理することができます。
  3. ファイルの移動: ファイルを別の場所に移動する場合、ファイル名が変わることがあります。このような場合、一括でファイル名を変更して移動先に合わせることができます。

以上のような理由から、ファイル名を一括で変更できるツールは、データの管理や整理に役立ちます。特に、大量のファイルを扱う場合には、手動で変更するのは非常に手間がかかるため、自動的に一括で変更できるツールが必要になります。

以下に手順を示します。

  1. VSCodeを起動し、スクリプトファイル(.ps1ファイル)を作成する
  2. ディレクトリのパスを指定する

    変更したいファイルが含まれるディレクトリのパスを指定します。例えば、以下のようになります。

    powershell
    $directoryPath = "C:\Users\username\Documents\MyFiles"
  3. 変更前の文字列と変更後の文字列を指定する

    変更前の文字列と変更後の文字列を指定します。例えば、以下のようになります。

    powershell
    $oldString = "before"
    $newString = "after"
  4. ディレクトリ内のファイル名を変更する

    指定したディレクトリ内のファイル名を一括で変更します。具体的には、以下のようなスクリプトを実行します。

    powershell
    Get-ChildItem $directoryPath | ForEach-Object {
        $newName = $_.Name.Replace($oldString, $newString)
        Rename-Item $_.FullName $newName
    }

    このスクリプトでは、Get-ChildItemコマンドレットを使って、指定したディレクトリ内のすべてのファイルとフォルダを取得し、ForEach-Objectコマンドレットを使って、各ファイルに対して処理を行います。ファイル名を変更するには、Replaceメソッドを使って、ファイル名の中の変更前の文字列を変更後の文字列に置換します。そして、Rename-Itemコマンドレットを使って、変更後のファイル名に変更します。

(完成したスクリプト)

changeFileName.ps1
# ディレクトリのパスを指定する
$directoryPath = "C:\Users\username\Documents\MyFiles"
# 変更前の文字列と変更後の文字列を指定する
$oldString = "before"
$newString = "after"

# ディレクトリ内のファイル名を変更する
Get-ChildItem $directoryPath | ForEach-Object {
    $newName = $_.Name.Replace($oldString, $newString)
    Rename-Item $_.FullName $newName
}

これで、指定したディレクトリ内のすべてのファイル名が一括で変更されました。必要に応じて、スクリプトをカスタマイズして、より柔軟に対応できるようにすることができます。

例えば、下記の様に書き換えることで「$directoryPath」「$oldString」「$newString」を対話式で入力できるスクリプトを作成することができます。

changeFileName.ps1
$directoryPath = Read-Host "変更したいファイルが存在するディレクトリのパスを入力してください。"
$oldString = Read-Host "変更前の文字列を入力してください。"
$newString = Read-Host "変更後の文字列を入力してください。"

Get-ChildItem $directoryPath | ForEach-Object {
    $newName = $_.Name.Replace($oldString, $newString)
    Rename-Item $_.FullName $newName
}

このスクリプトを実行すると、最初に変更したいファイルが存在するディレクトリのパス、次に変更前の文字列、最後に変更後の文字列を入力するようになります。入力した値に基づいて、ファイル名の置換が実行されます。