【脱・cmd】バッチファイルからPowerShellへ!

バッチファイル(.bat)からPowerShell(.ps1)への移行をイメージした比較画像。左側には古いMS-DOS風の画面と手作業のファイル、右側にはPowerShellのコード(Get-DateやWhere-Object)と自動化されたデータパイプラインが描かれ、「バッチで消耗していませんか?PowerShellで『自由』を手に入れよう!」というキャッチコピーが入ったスグブログのアイキャッチ画像

エンジニアのための入門・書き換えガイド

プログラムを実践してきた筆者が、基本構文から実務で使える便利コマンドまで徹底解説します。

windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。

目次

なぜバッチファイルからPowerShellなのか

教師

「あぁ、また文字化けか……」

Windowsエンジニアなら誰もが一度は、メモ帳で書いたバッチファイル(.bat)を叩いた瞬間に真っ黒な画面で暴れる「謎の記号」に頭を抱えたことがあるはずです。

ファイル名に日付を入れてバックアップを取りたいだけなのに、%date:~0,4%%date:~5,2%… といった、まるで呪文のような文字列をググりながら必死に打ち込んだ経験はありませんか?

確かに、長年連れ添ったバッチファイルは手軽です。
しかし、現場のDX化が進み、クラウドやJSON、複雑なAPI連携が当たり前になった令和の今、「コマンドプロンプト(bat)」という武器だけでは、正直戦えなくなってきています。

「batで無理やり書けばなんとかなる」
その職人気質なこだわりが、実はあなたの貴重な残業時間を奪っているかもしれません。

そこでおすすめしたいのが、Windowsの標準シェルでありながら、圧倒的なパワーを秘めた「PowerShell」です。

「難しそう」「青い画面はとっつきにくい」
そう思って避けてきたあなたへ。

この記事では、IT現場の「泥臭い自動化」を支えてきたエンジニアの視点で、バッチファイルで消耗していたあの日々を過去にする「PowerShellの最短攻略法」を解説します。

この記事を読み終える頃には、あなたは「.bat」を右クリックして編集するのをやめ、自信を持って「.ps1」を作り始めているはずです。

  • なぜ今、PowerShellなのか?
    • Windows 10/11の標準シェルがPowerShellへ移行している現状。
    • bat(コマンドプロンプト)では難しかった「複雑な条件分岐」や「JSON/XML操作」が容易になるメリット。
  • この記事で学べること
    • PowerShellの起動と実行ポリシーの設定。
    • batファイルとの書き方の違い(比較表)。

 準備:実行ポリシーの設定(最初につまずくポイント)

エラー

新しくスクリプトを学ぶ時に全く別の箇所でつまずき挫折することはよくあります。なのでまずはPowershellで最初につまずくポイントを整理しておきます。

Powershellで最初につまずくポイント
  • PowerShellはデフォルトではスクリプト(.ps1)が実行できない仕様。
  • Set-ExecutionPolicy コマンドの紹介。RemoteSigned への変更手順をコマンド例とともに解説。

PowerShellはデフォルトではスクリプト(.ps1)が実行できない仕様

PowerShellの学習を始めた人が、真っ先にぶつかる「高い壁」。 それが、「スクリプトが実行できません」という無慈悲な赤文字のエラーです。

「せっかく勉強しようと思ったのに、最初から拒否されるのか……」と、ここで挫折してしまうのは本当にもったいない!

実はこれ、PowerShellが「悪意のあるプログラムからあなたのPCを守るため」にあえてかけている「強力なセーフティ(安全装置)」なのです。バッチファイル(.bat)にはなかった、現代的なセキュリティの考え方ですね。

この安全装置を、開発に支障がない程度に「少しだけ緩める」のが、最初の一歩になります。

実行ポリシーを「RemoteSigned」へ変更する

実務で最もバランスが良い設定が RemoteSigned です。 「自分で書いたスクリプトは動かすけど、ネットから拾ってきた怪しいやつは署名がないと動かさないよ」という、まさにエンジニアのための設定です。

設定手順はたったの2ステップ。

  1. PowerShellを「管理者として実行」で起動する (ここを忘れると、設定変更自体が拒否されます!)
  2. 魔法のコマンドを打ち込む
Set-ExecutionPolicy RemoteSigned

コマンドを打つと、「実行ポリシーを変更しますか?」と聞かれますので、迷わず Y(または A)を押してエンター。これで、あなたのPCは「PowerShellを受け入れる準備」が整いました。

【プロのワンポイントアドバイス】 「セキュリティを下げるのは怖い……」と思うかもしれませんが、ご安心を。この設定は、あくまで「スクリプトファイル(.ps1)を直接叩けるようにする」ためのもの。まずはここを突破しないと、PowerShellの真価を味わうことはできません。

【比較で覚える】bat vs PowerShell 基本構文

「コマンドプロンプト(bat)で培った知識は、もうゴミ箱行きなのか?」 いいえ、そんなことはありません。

PowerShellはバッチファイルの進化系です。多くのコマンド(dircdcopy など)が「エイリアス(別名)」として引き継がれているため、今までの操作感のまま、より強力な書き方ができるようになります。

まずは、最もよく使う「基本の型」を比較表でサクッと確認してみましょう。

bat vs PowerShell 基本構文

項目バッチファイル (.bat)PowerShell (.ps1)ポイント
変数set VAR=value$var = “value”PSは頭に $ を付けるだけ!
出力echo HelloWrite-Host “Hello”echo でも動くが正式にはこれ
コメントrem または ::#プログラミング言語に近い #
引数%1, %2$args[0], $args[1]0番目から始まる配列形式
日付の取得%date% (要整形)Get-Dateオブジェクトとして高機能

実際のコードで見比べる「変数の扱い」

バッチファイルで一番イライラするのは、変数を「%」で囲んだり、代入の時にスペースを空けてはいけなかったりする独特のルールですよね。PowerShellなら、もっと直感的に書けます。

バッチファイルの場合

@echo off
set NAME=SuguBlog
echo Hello, %NAME%!
pause

PowerShellの場合

# 変数に代入(スペースがあってもOK!)
$name = "SuguBlog"

# 文字列の中でそのまま展開できる
Write-Host "Hello, ${name}!"

# 画面を止めたい時は Read-Host
Read-Host "Enterキーを押して終了してください..."

なぜPowerShellの方が「楽」なのか?

バッチファイルの場合、変数を連結したり計算したりするたびに set /a や複雑なエスケープ処理が必要でした。

しかし、PowerShellは「エンジニアが直感的に書きたいように書ける」ように設計されています。 例えば、文字列の中で $name と書くだけで中身を表示してくれる「変数展開」のスマートさ。これだけでも、書き換えのストレスが半分以下になるはずです。

PowerShellの最大の特徴「オブジェクト」を理解する

パソコン教室
見出し
  • テキストではなく「モノ(オブジェクト)」としてデータを扱う考え方の解説。
  • パイプライン(|)の強力さ
    • 例:Get-ChildItem | Where-Object { $_.Length -gt 1MB }
    • (1MB以上のファイルを抽出する、といった直感的な操作例)

バッチファイルやLinuxのシェルを使っていると、コマンドの実行結果はただの「文字(テキスト)」として返ってきます。 そのため、特定のデータを取り出すには、複雑な findstrawk を駆使して、文字を切り刻む必要がありました。

しかし、PowerShellは違います。 返ってくるのは文字ではなく、データが詰まった「オブジェクト(情報の塊)」なのです。

「文字」ではなく「中身」で会話する

例えば、ファイルのサイズを知りたいとき。 バッチファイルでは dir の結果から「何文字目から何文字目がサイズで……」とパズルをしていました。

魔法の杖「パイプライン(|)」の真骨頂

PowerShellなら、ファイルという「オブジェクト」に「ねぇ、サイズ(Length)だけ教えて?」と聞くだけで終わります。

この「オブジェクト」の真価を発揮するのが、おなじみの縦棒 |(パイプライン) です。 PowerShellのパイプは、ただ結果を渡すだけではありません。「データの塊を、次のコマンドへ丸ごと放り投げる」役割を持っています。

1MB以上のファイルだけを「スグ」に見つける例

直感的なフィルタリング

# カレントディレクトリのファイル一覧を取得して、
# その中から「サイズが1MBより大きいもの」だけを選び出す
Get-ChildItem | Where-Object { $_.Length -gt 1MB }

これ、バッチファイルで書こうとしたら何行必要か想像してみてください。 PowerShellなら、たった1行。「何を取得して(Get)」「どう分けるか(Where)」を繋げるだけで、複雑なロジックが完成します。

「$_」という、ちょっと不思議な記号

コードの中に出てきた $_ という記号。最初は「何これ?」と思うかもしれませんが、これは「今、パイプラインを通っているそのデータ」を指す代名詞です。

「目の前のコイツの、サイズ(Length)を見て!」 そんな風にPCに指示を出しているイメージですね。

実務で「スグ」使える逆引きレシピ 3選

パソコン教室
見出し
  • ① ファイルのバックアップ(日付付与)
    • Get-Date フォーマットを使ったファイル名生成。
  • ② 特定の文字列を含むファイルの検索と抽出
    • Select-String の使い方。
  • ③ CSVファイルの読み込みと加工
    • Import-Csv でデータをループ処理する方法。

「理屈はわかった。で、実際どう使うの?」 そんな声にお応えして、今日からあなたの現場で即戦力になる3つの鉄板レシピを用意しました。バッチファイルでは苦労していたあの作業が、驚くほどスマートに片付きます。

① ファイルのバックアップ(日付付与)

ログファイルや設定ファイルを保存する際、「ファイル名_20240329.bak」のように日付を入れたいケースは多いですよね。

日付付きコピーの決定版

# 今日の日付を「yyyyMMdd」形式で取得
$date = Get-Date -Format "yyyyMMdd"

# 元ファイルを日付付きでコピー
Copy-Item "C:\logs\app.log" "C:\backup\app_$date.log"

【ここがスゴイ!】 バッチファイルのように %date:~0,4% といった複雑な切り出しは不要。-Format を指定するだけで、あなたが欲しい形の日付が手に入ります。

② 特定の文字列を含むファイルを一括検索

「あの設定値、どのファイルに書いたっけ?」 そんな時は Select-String の出番です。Linuxの grep に近い感覚で使えます。

# 「Error」という文字が含まれる .txt ファイルをサブフォルダまで検索
Get-ChildItem -Recurse *.txt | Select-String "Error"

【ここがスゴイ!】 -Recurse をつけるだけで、サブフォルダまで根こそぎ探してくれます。結果には「行番号」も表示されるので、修正作業が爆速になります。

③ CSVファイルの読み込みと加工

Excelで管理しているリストを元に、フォルダを一括作成したり設定を変更したりする場合、PowerShellは最強のツールになります。

# CSVを読み込んで、1行ずつ処理する
Import-Csv "C:\data\user_list.csv" | ForEach-Object {
    # 「UserName」列の値を使ってフォルダを作成
    New-Item -Path "C:\Users\Desktop" -Name $_.UserName -ItemType Directory
}

【ここがスゴイ!】 Import-Csv を使うと、CSVのヘッダー名をそのまま変数として扱えます。文字割りの処理を自分で書く必要はもうありません。


【+α】さらに一歩先へ:Active Directory(AD)連携

もしあなたが社内インフラや情シスの担当者なら、PowerShellは「知っておかなければならない武器」に変わります。

例えば、**「期限切れ間近のユーザーアカウントを抽出する」**といった作業。 GUI(マウス操作)で一人ずつ確認していたら日が暮れますが、PowerShell(Active Directoryモジュール)を使えば一瞬です。

# 30日以内にパスワードが切れるユーザーを一覧表示
Search-ADAccount -PasswordExpiring -TimeSpan 30.00:00:00 | Select-Object Name, SamAccountName

こうした「AD連携」や「サーバー構築の自動化」こそが、PowerShellの本領発揮。 まずは日々のファイル操作から慣れていき、徐々にこうした高度な自動化に挑戦していきましょう!

まとめ:小さな一歩が「エンジニアの自由」を作る

バッチファイル(.bat)からPowerShell(.ps1)への移行をイメージした比較画像。左側には古いMS-DOS風の画面と手作業のファイル、右側にはPowerShellのコード(Get-DateやWhere-Object)と自動化されたデータパイプラインが描かれ、「バッチで消耗していませんか?PowerShellで『自由』を手に入れよう!」というキャッチコピーが入ったスグブログのアイキャッチ画像
バッチファイルの限界を感じていませんか?PowerShellなら、たった1行のコードで複雑な自動化をスマートに実現できます。
見出し
  • PowerShellは最初は難しく感じるが、一度覚えると自動化の幅が劇的に広がる。
  • まずは「今のbatを1つだけPowerShellに書き換えてみる」ことから始めよう。

最後まで読んでいただき、ありがとうございます!

ここまで読んでくださったあなたは、もう薄々感じているはずです。 「バッチファイルで頑張っていたあの時間は、もっと短縮できたんだ」と。

もちろん、長年使い古した .bat をすべて捨てる必要はありません。 でも、もし明日「ファイル名を一括で変えたい」「ログから特定のエラーを探したい」という作業が発生したら、グッとこらえて PowerShell(.ps1) を開いてみてください。

最初は、実行ポリシーのエラーに首を傾げるかもしれません。 パイプラインの書き方に戸惑うかもしれません。

しかし、その「最初の一歩」を乗り越えた先には、面倒なルーチンワークを1行のコマンドで終わらせ、涼しい顔で定時に帰宅する「自由」が待っています。

次のステップへのヒント

  • まずは「1行」書いてみる: Get-ChildItem(dirの代わり)から始めてみましょう。
  • わからないことは「スグ」検索: PowerShellのコミュニティは広大です。困ったらこの記事を読み返してください。

ITエンジニアの世界は、新しい武器を手に入れた者勝ちです。 今日、あなたが手に入れた「PowerShell」という強力な剣を、ぜひ現場で振り回してみてくださいね。


これからも『スグブログ』では、エンジニアの皆さんが「スグ」に現場で使える技術ネタを発信していきます。

次は、Active Directoryの自動操作や、さらに高度なスクリプト術でお会いしましょう。 それでは、また!

バッチファイル(.bat)からPowerShell(.ps1)への移行をイメージした比較画像。左側には古いMS-DOS風の画面と手作業のファイル、右側にはPowerShellのコード(Get-DateやWhere-Object)と自動化されたデータパイプラインが描かれ、「バッチで消耗していませんか?PowerShellで『自由』を手に入れよう!」というキャッチコピーが入ったスグブログのアイキャッチ画像

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次