エンジニアのための入門・書き換えガイド
プログラムを実践してきた筆者が、基本構文から実務で使える便利コマンドまで徹底解説します。
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はデフォルトではスクリプト(.ps1)が実行できない仕様。
- Set-ExecutionPolicy コマンドの紹介。RemoteSigned への変更手順をコマンド例とともに解説。
PowerShellはデフォルトではスクリプト(.ps1)が実行できない仕様
PowerShellの学習を始めた人が、真っ先にぶつかる「高い壁」。 それが、「スクリプトが実行できません」という無慈悲な赤文字のエラーです。
「せっかく勉強しようと思ったのに、最初から拒否されるのか……」と、ここで挫折してしまうのは本当にもったいない!
実はこれ、PowerShellが「悪意のあるプログラムからあなたのPCを守るため」にあえてかけている「強力なセーフティ(安全装置)」なのです。バッチファイル(.bat)にはなかった、現代的なセキュリティの考え方ですね。
この安全装置を、開発に支障がない程度に「少しだけ緩める」のが、最初の一歩になります。
実行ポリシーを「RemoteSigned」へ変更する
実務で最もバランスが良い設定が RemoteSigned です。 「自分で書いたスクリプトは動かすけど、ネットから拾ってきた怪しいやつは署名がないと動かさないよ」という、まさにエンジニアのための設定です。
設定手順はたったの2ステップ。
- PowerShellを「管理者として実行」で起動する (ここを忘れると、設定変更自体が拒否されます!)
- 魔法のコマンドを打ち込む
Set-ExecutionPolicy RemoteSignedコマンドを打つと、「実行ポリシーを変更しますか?」と聞かれますので、迷わず Y(または A)を押してエンター。これで、あなたのPCは「PowerShellを受け入れる準備」が整いました。
【プロのワンポイントアドバイス】 「セキュリティを下げるのは怖い……」と思うかもしれませんが、ご安心を。この設定は、あくまで「スクリプトファイル(.ps1)を直接叩けるようにする」ためのもの。まずはここを突破しないと、PowerShellの真価を味わうことはできません。
【比較で覚える】bat vs PowerShell 基本構文
「コマンドプロンプト(bat)で培った知識は、もうゴミ箱行きなのか?」 いいえ、そんなことはありません。
PowerShellはバッチファイルの進化系です。多くのコマンド(dir や cd、copy など)が「エイリアス(別名)」として引き継がれているため、今までの操作感のまま、より強力な書き方ができるようになります。
まずは、最もよく使う「基本の型」を比較表でサクッと確認してみましょう。
bat vs PowerShell 基本構文
| 項目 | バッチファイル (.bat) | PowerShell (.ps1) | ポイント |
|---|---|---|---|
| 変数 | set VAR=value | $var = “value” | PSは頭に $ を付けるだけ! |
| 出力 | echo Hello | Write-Host “Hello” | echo でも動くが正式にはこれ |
| コメント | rem または :: | # | プログラミング言語に近い # |
| 引数 | %1, %2 | $args[0], $args[1] | 0番目から始まる配列形式 |
| 日付の取得 | %date% (要整形) | Get-Date | オブジェクトとして高機能 |
実際のコードで見比べる「変数の扱い」
バッチファイルで一番イライラするのは、変数を「%」で囲んだり、代入の時にスペースを空けてはいけなかったりする独特のルールですよね。PowerShellなら、もっと直感的に書けます。
バッチファイルの場合
@echo off
set NAME=SuguBlog
echo Hello, %NAME%!
pausePowerShellの場合
# 変数に代入(スペースがあっても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のシェルを使っていると、コマンドの実行結果はただの「文字(テキスト)」として返ってきます。 そのため、特定のデータを取り出すには、複雑な findstr や awk を駆使して、文字を切り刻む必要がありました。
「文字」ではなく「中身」で会話する
例えば、ファイルのサイズを知りたいとき。 バッチファイルでは dir の結果から「何文字目から何文字目がサイズで……」とパズルをしていました。
魔法の杖「パイプライン(|)」の真骨頂
この「オブジェクト」の真価を発揮するのが、おなじみの縦棒 |(パイプライン) です。 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"② 特定の文字列を含むファイルを一括検索
「あの設定値、どのファイルに書いたっけ?」 そんな時は Select-String の出番です。Linuxの grep に近い感覚で使えます。
# 「Error」という文字が含まれる .txt ファイルをサブフォルダまで検索
Get-ChildItem -Recurse *.txt | Select-String "Error"③ 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
}【+α】さらに一歩先へ:Active Directory(AD)連携
もしあなたが社内インフラや情シスの担当者なら、PowerShellは「知っておかなければならない武器」に変わります。
例えば、**「期限切れ間近のユーザーアカウントを抽出する」**といった作業。 GUI(マウス操作)で一人ずつ確認していたら日が暮れますが、PowerShell(Active Directoryモジュール)を使えば一瞬です。
# 30日以内にパスワードが切れるユーザーを一覧表示
Search-ADAccount -PasswordExpiring -TimeSpan 30.00:00:00 | Select-Object Name, SamAccountNameこうした「AD連携」や「サーバー構築の自動化」こそが、PowerShellの本領発揮。 まずは日々のファイル操作から慣れていき、徐々にこうした高度な自動化に挑戦していきましょう!
まとめ:小さな一歩が「エンジニアの自由」を作る

- PowerShellは最初は難しく感じるが、一度覚えると自動化の幅が劇的に広がる。
- まずは「今のbatを1つだけPowerShellに書き換えてみる」ことから始めよう。
最後まで読んでいただき、ありがとうございます!
ここまで読んでくださったあなたは、もう薄々感じているはずです。 「バッチファイルで頑張っていたあの時間は、もっと短縮できたんだ」と。
もちろん、長年使い古した .bat をすべて捨てる必要はありません。 でも、もし明日「ファイル名を一括で変えたい」「ログから特定のエラーを探したい」という作業が発生したら、グッとこらえて PowerShell(.ps1) を開いてみてください。
最初は、実行ポリシーのエラーに首を傾げるかもしれません。 パイプラインの書き方に戸惑うかもしれません。
しかし、その「最初の一歩」を乗り越えた先には、面倒なルーチンワークを1行のコマンドで終わらせ、涼しい顔で定時に帰宅する「自由」が待っています。
次のステップへのヒント
- まずは「1行」書いてみる:
Get-ChildItem(dirの代わり)から始めてみましょう。 - わからないことは「スグ」検索: PowerShellのコミュニティは広大です。困ったらこの記事を読み返してください。
ITエンジニアの世界は、新しい武器を手に入れた者勝ちです。 今日、あなたが手に入れた「PowerShell」という強力な剣を、ぜひ現場で振り回してみてくださいね。
これからも『スグブログ』では、エンジニアの皆さんが「スグ」に現場で使える技術ネタを発信していきます。
次は、Active Directoryの自動操作や、さらに高度なスクリプト術でお会いしましょう。 それでは、また!
