PR

PowerShellで「Linux風」に連番フォルダを作成する方法

OSS開発

Windowsを使用している皆さんへ、Powershellをご存知ですか? Powershellは「CUI(Character User Interface)」を利用可能にするスクリプト言語です。

スクリプト言語は、「スクリプトファイル」として知られるファイルを実行できます。Powershellの場合、拡張子は「.ps1」です。ファイルがPATHに追加されていれば、そのファイルをまるでオリジナルのコマンドのように使用できるようになります。

この記事では、Linuxの「mkdir」のように連番でディレクトリを作成できるスクリプトファイルの作り方を紹介し、WindowsでLinuxのmkdirを再現します。

WordPressブロガーの方必見! 外出先でもブログ執筆作業がはかどる、 Ankerの大容量モバイルバッテリー をご紹介します。

【前準備】

1.CUIとは?

CUIは「character-based user interface(文字ベースUI)」の略で、文字を用いてコンピュータを操作する方法を指します。詳細については、以下の記事をご覧ください。

2.Powershell 7 とは?

この記事では「Powershell 7」を使用します。以下のコマンドをPowershellのターミナルに入力することで、Powershell 7をインストールできます。

PowerShell
winget install --id Microsoft.Powershell --source winget # Powershell 7 をインストール

別のインストール方法については、以下をご覧ください。

Windows への PowerShell のインストール - PowerShell
Windows への PowerShell のインストールに関する情報

スクリプトファイル(.ps1)とは?

スクリプトファイルは、拡張子が「.ps1」であるファイルを指します。このファイルに特定の処理を記述し、Powershellを開いて./ファイル名.ps1と入力することで実行できます。

例として、「hello world !」と表示されるスクリプトファイルを作成してみましょう。ファイル名は「hello.ps1」とします。

PowerShell
# hello.ps1
Write-Host "hello world !"

以下のように、実行できました。

PowerShell
PS C:\Users\user\テスト> ./hello.ps1
hello world !

スクリプトファイル(.ps1)をオリジナルコマンドのように使う方法

スクリプトファイルをPATHに通すと、スクリプトファイルをまるでオリジナルのコマンドのように実行できます。先ほどの「hello.ps1」を「hello」とだけで実行できるように設定します。

方法は簡単です。「PATHが通っているフォルダにスクリプトファイルを置く」だけです。今回は「C:\Users\user\script」にPATHを通し、そこに「hello.ps1」を配置することにします。

「C:\Users\user\Documents\WindowsPowerShell\profile.ps1」を作成し、以下のコードを記述します。

PowerShell
# C:\Users\user\Documents\WindowsPowerShell\profile.ps1
$env:path +=';C:\Users\user\script' # 「script」にスクリプトファイルを格納すると実行できる

上記は、C:\Users\user\script」にPATHを通すという意味です。これにより、「hello」とだけ入力することでファイルが実行されるようになりました。

Powershellを再起動し、「hello」と入力してください。

PowerShell
PS C:\Users\user\テスト> hello
hello world !

スクリプトファイルが同じフォルダになくても実行されていることが分かります。

PATH通しについて詳しく知りたい方は、以下の記事を御覧ください。

Linuxのようなmkdirを作る!!

では、本題に入ります。Linuxのmkdirのような振る舞いをする「mkdirs.ps1」を作成しましょう。

1.mkdirとは?

mkdirは、「make directory」の略で、新しいフォルダを作成するためのコマンドです[1]mkdir フォルダ名と入力すると、フォルダが現在のディレクトリに新しく作成されます。

実は、Powershellではmkdirは初めから使用可能です。言い換えれば、Powershellには組み込み関数としてこの機能が組み込まれています。mkdirと入力すると、内部的には「New-Item -Type Directory」が実行されるように設定されています。

PowerShell
PS C:\Users\user\テスト> mkdir test1

    Directory: C:\Users\user\テスト

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----   2024/02/18 日曜日     1:15                test1

PS C:\Users\user\テスト> New-Item -Type Directory test2

    Directory: C:\Users\user\テスト

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----   2024/02/18 日曜日     1:15                test2

上記を見ると、「mkdir」と「New-Item -Type Directory」が同じ処理をしていることが分かります。詳細については、以下をご覧ください。

組み込み関数について - PowerShell
PowerShell の組み込み関数について説明します。

2.LinuxとWindowsのmkdirの違いとは?

mkdirの特徴は、「連番のフォルダを作成できる」ことです。mkdir {開始番号..終了番号}とすると、その数字の範囲内にフォルダが作成されます。

Bash
user@PC名 MINGW64 ~/テスト
$ mkdir {1..5}

user@PC名 MINGW64 ~/テスト
$ ls
1  2  3  4  5

しかし、Powershellのmkdirは先程確認した通り、実際には「New-Item -Type Directory」のエイリアスであるため、このような機能を直接サポートしていません。以下のように試みるとエラーが発生します。

PowerShell
PS C:\Users\user\テスト> mkdir {1..5}
mkdir: Cannot evaluate parameter 'Path' because its argument is specified as a script block and there is no input. A script block cannot be evaluated without input.

Powershellで上記と同じように連番の作成を行うには、「mkdir (1..5 | % { “{0:D2}” -f $_} )」のように記述します。

PowerShell
PS C:\Users\user\テスト> mkdir (1..5 | % { "{0:D2}" -f $_} )

    Directory: C:\Users\user\テスト

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----   2024/02/18 日曜日     1:15                01
d----   2024/02/18 日曜日     1:15                02
d----   2024/02/18 日曜日     1:15                03
d----   2024/02/18 日曜日     1:15                04
d----   2024/02/18 日曜日     1:15                05

しかし、これはLinuxのmkdirよりも手続きが煩雑です。そのため、Linuxの「mkdir」のようにmkdir {開始..終了}だけで簡単に連番を作成するスクリプトファイルを作成します。

Powershellで連番を作成する方法に興味がある方は、以下をご覧ください。

3.Linuxのmkdirのように連番を作成する

「mkdirs.ps1」という名前のスクリプトファイルを作成し、以下のコードをコピーしてください。

PowerShell
# mkdirs.ps1
Param(
    [String]$arg1="",
    [String]$arg2="",
    [String]$arg3=""
) 
if ("$arg1" -eq "") {
    Write-Host "`n引数がありません`nアーカイブする対象を引数に渡してください`n" -ForegroundColor 'Red'
    pause
    exit
}
try {
    $ErrorActionPreference = "Stop"
    if($arg1.Contains("..")) {
        $num = $arg1.split("..")
        $arg1 = "{0:D2}"
    }
    if($arg2.Contains("..")) {
        $num = $arg2.split("..")
        $arg2 = "{0:D2}"
    }
    if($arg3.Contains("..")) {
        $num = $arg3
        $arg3 = "{0:D2}"
    }
    $mozi = $arg1 + $arg2 + $arg3
    mkdir ($num[0]..$num[1] | % { $mozi -f $_} )
} catch {
    Write-Host $_ -ForegroundColor "Red" # catch内の例外情報は、「$_」変数でアクセスできる。
} finally {}

その後、Powershellを再起動し、mkdirs {1..5}と入力してください。

PowerShell
PS C:\Users\user\テスト> mkdirs {1..5}

    Directory: C:\Users\user\テスト

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----   2024/02/18 日曜日     1:16                01
d----   2024/02/18 日曜日     1:16                02
d----   2024/02/18 日曜日     1:16                03
d----   2024/02/18 日曜日     1:16                04
d----   2024/02/18 日曜日     1:16                05

これで、WindowsでもLinux風に連番のフォルダを簡単に作成できるようになります。

まとめ

この記事では、まるでLinuxの「mkdir」のように連番作成できるスクリプトファイルの作り方をまとめました。

Powershellではデフォルトでmkdirが使用可能ですが、Linuxのものとは異なるため、連番作成のコマンドが異なります。そこで、スクリプトファイルを作成することでWindowsでもLinuxのmkdirのように簡単に連番作成ができるようにしました。

Windowsの連番作成コマンドは少し煩雑なので、このスクリプトを利用することでその手間を解消できれば幸いです。


  1. ディレクトリを作成する!mkdirコマンドの詳しいまとめ【Linuxコマンド集】 ↩︎

タイトルとURLをコピーしました