「Windows」タグアーカイブ

PowerShellで数十万行のCSVを高速処理するベストプラクティス

PowerShellで数十万行以上のCSVを扱うと、
「読み込みが遅い」「メモリが一気に膨れる」「処理が固まったように見える」
といった問題が発生しがちです。

実はこれ、PowerShellのCSV処理の仕組みによる“あるある”で、
正しい書き方をすれば劇的に高速化できます。

この記事では、現場でも使われている 高速処理テクニック・実装例・注意点 をまとめます。


✔ なぜPowerShellはCSV処理が遅くなるのか

PowerShellの Import-Csv は便利ですが…

  • 全行を一度にメモリへ展開する

  • オブジェクト化のコストが高い

  • 数十万件を超えると数百MB〜GB級のメモリ使用

という特徴があります。

そのため、以下のような書き方は最も遅くなります。


✔ 高速化のポイントは「逐次読み込み」と「Stream処理」

PowerShellで数十万行を高速に処理する場合の最重要ポイントは以下。

💡 高速化の基本

  1. Import-Csv を使わず StreamReader を使う

  2. 1行ずつ処理して不要になったデータは捨てる

  3. Select-Object, Where-Object をループで使わない

  4. 型変換を最小限にする

  5. 出力は StringBuilder にまとめて最後に書き込む


✔ ベストプラクティス①:StreamReaderで逐次処理

最も高速でメモリ効率も良い方法です。

✔ 特徴

  • Import-Csv ではなく Split で直接取得 → 超高速

  • メモリ使用量は常に一定

  • 数百万行でも余裕


✔ ベストプラクティス②:Import-Csv を使う場合の高速化

「やっぱりオブジェクトで扱いたい」という場合はこちら。

✔ 注意点

  • ForEach-Object -ParallelPowerShell 7 以降限定

  • 並列化は CPUコア数に依存

  • メモリ使用量は多め


✔ ベストプラクティス③:Select-Object / Where-Object を避ける

以下は遅くなりがち:

理由:すべての行をオブジェクトとして保持してしまう。

💡 改善

または、最速は StreamReader + Split


✔ ベストプラクティス④:StringBuilderで出力バッファを作る

行ごとに Add-Content を実行すると激遅になります。

✔ StringBuilderを使う(高速)


✔ ベストプラクティス⑤:PowerShell 7 を使う

PowerShell 5.1 から PowerShell 7 に変えるだけで速度が倍以上になるケースが多いです。

理由

  • .NET Core ベースで高速化

  • ForEach-Object が最適化

  • Parallel 処理対応


✔ 実際の処理速度比較(目安)

手法100万行の処理メモリ使用量
Import-Csv → ループ数十秒〜数分数百MB〜1GB超
Import-Csv -Parallel10〜40秒多め
StreamReader + Split5〜15秒数MB

※ PCスペックにより変動。


✔ まとめ:最速は「StreamReader+Splitによる逐次処理」

PowerShellで数十万行のCSVを高速処理するなら

✔ 最適解

  1. 逐次読み込み(ストリーム処理)

  2. 行ごとにSplitして必要な列だけ触る

  3. StringBuilderでまとめて出力する

  4. PowerShell 7 ならParallel化も可能

業務バッチで使う場合は、
StreamReader方式が最も安全で高速です。

実際の現場でも「メモリ溢れ対策」「速度改善」で最も採用されています。

PowerShellの構文エラー原因TOP3:全角引用符・NBSP・BOM

🧩 PowerShellの構文エラー原因TOP3:全角引用符・NBSP・BOM

PowerShellスクリプトを実行したときに、
UnexpectedToken」や「文字列に終端記号がありません」という赤エラーが出て動かない——。
そんな経験はありませんか?

実はこれらの構文エラー、文法ミスではなく「文字の種類」 が原因で起きていることが非常に多いです。
特に日本語環境では、以下の3つがPowerShellを混乱させる典型的なトラブル要因です。


🥇 第1位:全角引用符(“ ”、” ”)

最も多いのがこれ。
WordやWebサイト、ブログなどからコードをコピーした際に、
「普通のダブルクォート(")」が「全角のスマートクォート()」に変わってしまう現象です。

PowerShellはこれを文字列の区切りとして認識できません
そのため以下のようなエラーが出ます。

式またはステートメントのトークン '営業企画部' を使用できません。

🔧 対処法:

  • 全角の “ ” を半角の ” ” に置換

  • コードエディタで「スマートクォート自動変換」をOFFにする


🥈 第2位:NBSP(ノーブレークスペース)

見た目は半角スペースですが、内部的には U+00A0 という別の文字です。
HTMLページやブログからコピーしたときに非常によく混入します。

PowerShell上では、
「半角スペースとして解釈されない」ため構文が崩れ、
UnexpectedToken などの不可解なエラーが出ます。

🔧 対処法:

  • サクラエディタやVS Codeで「不可視文字表示」をONにする

  • 以下のコマンドでNBSPやゼロ幅文字を除去可能:


🥉 第3位:BOM付きUTF-8で保存されている

UTF-8自体はPowerShellでも推奨されていますが、
「BOM(Byte Order Mark)」付きUTF-8 で保存された .ps1
スクリプトの先頭に見えない U+FEFF が混入し、これが原因で構文エラーになる場合があります。

🔧 対処法:

  • ファイルを UTF-8(BOMなし) で保存

  • サクラエディタやVS Codeで「保存形式:UTF-8(BOMなし)」を明示的に選択


✅ エラーを防ぐためのおすすめ設定

PowerShellのスクリプトを書くときは、以下の設定を徹底すると安心です。

・エンコード:UTF-8(BOMなし)
・行末コード:CRLF
・クォート文字:必ず半角(" または ')
・不可視文字表示:ON
・自動変換(スマートクォート、全角変換など):OFF

🧰 トラブルを一掃するワンライナー

既におかしな文字が混入している場合は、
次のPowerShellコマンドでクリーンアップできます。

これで、全角クォート・NBSP・BOMをすべて除去できます。


🚀 まとめ

PowerShellの構文エラーの多くは「コードが壊れている」のではなく、
文字の種類が混ざっているだけ です。

  • “全角クォート” → 半角 " " に直す

  • “NBSP” → 普通のスペースに置換

  • “BOM付きUTF-8” → BOMなしに保存

この3点を意識するだけで、
もう意味不明な赤いエラーに悩まされることはありません。

PowerShellスクリプトの基本構文まとめ:変数・条件分岐・ループを完全マスター

Windowsの自動化やサーバ運用で大活躍するPowerShell。
「使い始めたいけど、基本構文がよく分からない…」という人向けに、この記事ではPowerShellの基礎構文を一気に整理します。

以下の内容を押さえることで、シンプルなスクリプトはすぐ書けるレベルになります。


✅ PowerShellスクリプトの基本ルール

内容説明
拡張子.ps1
コメント# コメント
大文字小文字区別しない (例: $Value と $value は同じ)
変数宣言$変数名 = 値
実行ポリシー変更Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

💡 セキュリティのため、実行ポリシー設定は理解したうえで操作しましょう。


🧮 変数の基本 

ポイント

  • $ を付けて変数を宣言

  • 文字列中で変数展開できる


🔁 配列(リスト) 


📦 ハッシュテーブル(連想配列) 


✅ 条件分岐(If / ElseIf / Else) 

よく使う比較演算子

演算子意味
-eq等しい
-ne等しくない
-gtより大きい
-ltより小さい
-ge以上
-le以下

🔁 ループ制御

for文

foreach文 


🔄 while / do-while 


📦 関数の定義 


📎 パイプラインとフィルタ

コマンド説明
Get-Processプロセス一覧取得
Where-Object条件絞り込み
Sort-Object並び替え
Select-Object指定列のみ取得

💡 実用例:ファイル一覧を取得して出力


🎯 まとめ

PowerShellの基本構文は次の通り:

  • ✅ 変数 $var = 値

  • ✅ 条件分岐 if () {}

  • ✅ ループ for / foreach / while

  • ✅ ハッシュテーブル @{ Name = "A" }

  • ✅ 関数 function X(){}

  • ✅ パイプライン |

まずは小さな処理から試し、Windows作業をどんどん自動化していきましょう!


❓ よくある質問(FAQ)

Q. PowerShell ISEとWindows Terminalどっち使うべき?
A. 基本は Windows Terminal + VS Code を推奨。補完機能が強いです。

Q. 管理者権限はいつ必要?
A. ファイル操作・レジストリ操作・サービス制御等で必要になります。

DOSバッチのif文で不等号が効かない!その原因と正しい演算子一覧を紹介

Windowsバッチで数値比較をしようとして、if %a% > 10 のように書いたのに、なぜかうまく動かない…そんな経験はありませんか?

実はDOSバッチのif文では、><といった不等号は比較演算子として認識されません。本記事では、不等号が効かない理由と、**正しい比較演算子(GTR / LSS / GEQ / LEQ)**の使い方を一覧付きでわかりやすく解説します。


🔍 なぜ><が使えないのか?

DOSバッチでは、><リダイレクト記号として解釈されます。

記号意味
>標準出力をファイルへ出力
<標準入力としてファイルを読み込み

そのため以下のようなコードを書くと…

この>は「10 に出力をリダイレクトする」ものとして扱われ、比較として動作しません。


✅ if文に使える数値比較演算子一覧

バッチファイルで数値比較を行う場合は、以下の演算子を使用します。

演算子意味不等号で表すと
GTRGreater Than>
LSSLess Than<
GEQGreater or Equal>=
LEQLess or Equal<=
!ERROR! A6 -> Formula Error: Unexpected operator '='Equal!ERROR! C6 -> Formula Error: Unexpected operator '='

✅ 正しい書き方例(数値比較)


⚠ NG例(ダメな書き方)


💡 文字列比較をする場合は「==」を使用


📎 不等号を「文字」として表示したい場合

^ を使ってエスケープ(無効化)することで、文字として扱えます。


✅ まとめ

やりたいこと書き方
数値比較GTR / LSS / GEQ / LEQ
文字列比較!ERROR! B3 -> Formula Error: Unexpected operator '='
不等号を文字として表示^

DOSバッチでは><はリダイレクト記号として解釈されるため、if文内では専用の比較演算子を使う必要があります。 比較がうまく動かないと感じたら、まず演算子を見直してみましょう!

PowerShellスクリプトが権限エラーで実行できない!ExecutionPolicy設定で解決する方法

PowerShell でスクリプトを実行しようとすると
「このシステムではスクリプトは実行できません」
といった権限エラーが出ることがあります。

原因は ExecutionPolicy(実行ポリシー) の設定にあります。
この記事では、

  • Get-ExecutionPolicy -List で確認できる各項目の意味

  • 設定できる ExecutionPolicy の種類

  • 初心者でも安全にスクリプトを実行するための方法

を解説します。


Get-ExecutionPolicy -List で分かること

Get-ExecutionPolicy -List を実行すると、スコープごとの設定が一覧表示されます。

例:

各スコープの意味

  • MachinePolicy
    グループポリシーでコンピュータ全体に適用される設定。通常の環境では Undefined が多い。

  • UserPolicy
    グループポリシーでユーザー単位に適用される設定。これも Undefined が一般的。

  • Process
    現在の PowerShell プロセス(セッション)だけに適用される一時設定。
    終了するとリセットされる。

  • CurrentUser
    現在ログインしているユーザーだけに適用される設定。
    管理者権限なしで変更可能なので、初心者はここを設定するのが安全

  • LocalMachine
    コンピュータ全体に適用される設定。管理者権限が必要。


ExecutionPolicy の種類

設定できる実行ポリシーには以下の種類があります。

Policy概要署名の要否典型用途リスク度(1-5)推奨スコープ設定例(Set-ExecutionPolicy)補足
Restrictedスクリプト実行を全て禁止不要(そもそも実行不可)企業の厳格端末/検証用の完全遮断2LocalMachineSet-ExecutionPolicy Restricted -Scope LocalMachine既定値になりがち。学習/自動化には不向き
AllSigned信頼された発行元の署名付きのみ実行可必須(すべて)厳格な本番環境での運用3LocalMachine または CurrentUserSet-ExecutionPolicy AllSigned -Scope CurrentUser署名管理が前提。外部スクリプトの安全性担保
RemoteSignedローカル作成は実行可/インターネット由来は署名必須リモート(ダウンロード物)のみ必須一般的な開発/運用でのバランス設定2CurrentUser(推奨)Set-ExecutionPolicy RemoteSigned -Scope CurrentUser最も無難。管理者権限不要でユーザー単位に適用
Unrestricted全て実行可(初回に警告が出る場合あり)不要検証/一時的な作業で制限を緩めたい時4Process または CurrentUserSet-ExecutionPolicy Unrestricted -Scope Process恒常運用は非推奨。警告は出るが実行は可能
Bypassブロック/警告なしで全て実行不要自動化ジョブ/一時的に完全無視したい時5Process(強く推奨)Set-ExecutionPolicy Bypass -Scope Processセッション限定で使う。恒常設定は危険
Undefinedスコープに設定なし(上位スコープへ委譲)ポリシー未設定状態の表示1全スコープUndefinedの場合は実質Restrictedが有効になることが多い

 


安全に設定する方法

権限エラーを解決するには、スコープを指定して設定します。

現在のユーザーだけに設定する場合(推奨)

  • 管理者権限が不要

  • 他のユーザーやシステム全体には影響しない

  • ローカルで作ったスクリプトは実行可能

一時的に設定する場合(PowerShellを閉じるとリセット)


まとめ

  • ExecutionPolicy が原因で PowerShell スクリプトが実行できないことがある

  • Get-ExecutionPolicy -List でどのスコープに設定があるかを確認できる

  • 初心者は CurrentUser に RemoteSigned を設定するのが安全

  • 目的に応じて、Process(一時的)や LocalMachine(管理者権限が必要)も使える

PowerShellでフォルダ内のファイル一覧を取得してCSVに出力する方法

Windows環境でフォルダ内のファイル一覧を取得したい場面は多々あります。例えば、定期的なファイル管理や監査用の記録、またはバックアップ作業のために一覧をエクスポートしたい場合です。
PowerShellを使えば、簡単にフォルダ内のファイル一覧を取得し、そのままCSV形式で保存することができます。

この記事では、PowerShellでフォルダ内のファイル一覧を取得し、CSVに出力する方法を解説します。


基本コマンド

まずは基本となるコマンドです。
以下の例では、C:\Test フォルダ内のファイル一覧を取得し、filelist.csv に出力します。

各コマンドの意味

  • Get-ChildItem "C:\Test"
    指定フォルダ内のファイルやフォルダを取得します。gcidir と省略可能。

  • Export-Csv
    取得結果をCSVに変換して保存します。

  • -NoTypeInformation
    CSVの先頭に不要な型情報行を出力しないようにします。

  • -Encoding UTF8
    CSVファイルの文字コードをUTF-8に指定します(文字化け防止)。


ファイルのみ取得する場合

フォルダ名は不要で、ファイルだけを取得したい場合は -File オプションを指定します。


サブフォルダも含めて取得する場合

サブフォルダ内のファイルもまとめて一覧化するには -Recurse を付けます。


出力内容を絞り込む

CSVに出力する項目を指定することも可能です。例えば、フルパス、サイズ、更新日時 だけを出力する場合:

これにより、余計な情報を省き、必要なデータだけをCSVに保存できます。

実行例イメージ

出力されるCSVファイルをExcelで開くと、以下のように一覧が表示されます。

FullName Length LastWriteTime
C:\Test\document1.txt 1234 2025/09/17 10:30:00
C:\Test\image.png 45678 2025/09/16 15:20:00
C:\Test\subfolder\report.docx 9876 2025/09/15 09:10:00

まとめ

  • Get-ChildItem でフォルダ内のファイル一覧を取得できる

  • Export-Csv を組み合わせることで、簡単にCSVへ出力可能

  • -File-RecurseSelect-Object を使えば用途に合わせて柔軟に一覧化できる

PowerShellを使えば、手作業でリスト化する手間を省き、自動化できるのでぜひ活用してみてください。

Windowsで使用中のポート番号を確認する方法

Windowsで現在使用中のポート番号を確認する方法をメモしておきます。

使用中のポート番号を確認する方法

  1. コマンドプロンプトを起動してコマンド「netstat -ano」を入力してEnter。
    netstatコマンドのオプションの意味は以下の通り。 
    オプション説明
    aすべてのネットワーク接続を表示する
    nDSN逆引きを行わない
    oプロセスIDを表示する
    p プロトコル指定したプロトコルの接続のみ表示する
    プロトコル:TCP, UDP, TCPv6, UDPv6
    rルーティングテーブルを表示する
    sプロトコルごとの統計情報を表示する
    ?コマンドのヘルプを表示する
  2. 以下の様にローカルアドレスの「:」の右側に表示されているのがポート番号となります。

プロセスID(PID)から実行中のサービス名を特定する方法

上記でプロセスID(PID)を特定出来たら該当するサービス名を特定することも出来ます。

例としてポート番号「1521」のPID「1604」がどのサービスで使用されているかタスクマネージャーで確認してみましょう

  • 以下の様にタスクマネージャーのサービス一覧で該当するPID「1604」のサービス名が「OracleOraDB18Home1TNSListener」であることが確認出来ました。

 

 

Microsoft、2013年7月以来の急落:変革の岐路に立たされる IT 巨人

2015年1月27日(現地時間)、米国株式市場は大幅下落に見舞われた。その波に飲み込まれる形で、Microsoftの株価は前日比で約9.3%安。わずか1日で時価総額にして約4兆円が吹き飛ぶという衝撃的なニュースが世界を駆け巡った。

「WindowsとOfficeの会社」として長年IT業界を牽引してきた同社に、いま何が起きているのか──。この急落は単なる決算ショックではなく、パソコン時代からモバイル・クラウド時代への大転換点を象徴する出来事といえる。


株価急落の背景 ― 投資家心理を冷やした3つの要因

Microsoftの2014年10〜12月期決算は、表面上の売上高では前年同期比8%増と悪くなかった。だが市場の評価は冷たかった。その理由は主に以下の3点にある。

要因 内容
1. 為替(ドル高)の影響 海外売上比率が高く、ドル高が利益を圧迫。特に欧州・新興国市場の通貨安が重くのしかかった。
2. PC市場の停滞 Windows 7/8系の需要が伸び悩み、XPサポート終了特需も一巡。出荷台数は前年割れ。
3. モバイルでの存在感不足 AndroidとiOSが世界のスマホ市場を席巻。Windows Phoneはシェア1桁に留まり、開発者・ユーザー双方から支持を得られなかった。

特に3つ目の要因は深刻だった。スマートフォンの普及がパソコン出荷を食い尽くす中、Microsoftはモバイル市場で明確な成功を掴めず、投資家の失望を招いた。


業界トレンドの変化 ― 「ポストPC時代」への対応遅れ

2010年代半ば、IT業界は**“ポストPC時代”**へと突入していた。
AppleはiPhoneで世界の収益構造を変え、GoogleはAndroidでモバイルエコシステムを支配。Amazonはクラウド(AWS)でインフラビジネスを開拓していた。

一方のMicrosoftは、依然としてWindowsとOffice依存の収益構造から抜け出せていなかった。Surfaceシリーズの投入などで新たな挑戦は見せたものの、スマートデバイス市場でのプレゼンスは限定的。
「遅れてきた挑戦者」としての立場に甘んじていた。


Microsoftの強みと課題 ― 巨大な資金力と構造転換のジレンマ

ただし、Microsoftは単なる「衰退企業」ではない。むしろ、企業向けビジネスの強さ圧倒的な資金余力は健在だ。

分野 当時の状況
クラウド(Azure) Amazonに続き市場2位の座を確保。成長率は高く将来性あり。
Office 365 サブスクリプション化を推進。法人向けで高い安定収益を確保。
Bing・Xboxなど 利益は限定的ながら、新規事業の実験場として機能。

課題は、OS中心の利益構造から脱却できるかに尽きる。
いかにクラウドとサービス事業を「次の柱」に育てるか。これがサティア・ナデラCEO(2014年就任)に課せられた最大のテーマだった。


ナデラ体制の方向性 ― 「クラウド・ファースト」への転換

ナデラ氏はCEO就任直後から「Mobile First, Cloud First」を掲げ、戦略転換を加速させた。
それまでのWindows依存型ビジネスから、Azure・Office 365・OneDriveなどのサブスクリプション型収益モデルへの移行を鮮明に打ち出した。

この時期、Microsoftは競合サービスとも積極的に連携し始めた。
たとえば、iOSやAndroid向けにOfficeアプリを提供し、「他社OS上でもMicrosoftのサービスを使わせる」戦略へと舵を切った。
この変化は、かつての閉鎖的な姿勢とは一線を画す動きだった。


今後の展望 ― ショックの先に見える可能性

短期的には株価下落が続く可能性もあるが、長期的な転換期としての意味を見逃すべきではない。
クラウド事業はまだ成長初期にあり、エンタープライズ領域では圧倒的な信頼を維持している。
むしろこの下落を「成長痛」と捉えれば、再成長の種が既に撒かれているとも言える。


結論 ― 4兆円の下落が示すもの

1日で4兆円を失うというインパクトは、表面的には「失望売り」と映る。
だがその裏側では、Microsoftが過去の成功体験を脱ぎ捨て、未来へ再構築する過程にあることを意味している。

かつてパソコンの時代を築いた巨人が、クラウドとサービスの時代にどう生まれ変わるのか。
この2015年初頭の株価急落は、その大きな転換点の“痛み”であったのかもしれない。


🧩まとめ

観点 内容
時期 2015年1月27日:Microsoft株が約9.3%急落
背景要因 為替、PC市場低迷、モバイル市場での苦戦
構造課題 Windows・Office依存からの脱却
成長の芽 クラウド(Azure)、Office 365、法人基盤
象徴的意味 ポストPC時代への痛みを伴う転換点