【PowerShell】URLにアクセスして指定文字のある行を抽出してあれこれ

この記事は最新更新日から、2年以上経過しています。

概要

PowerShellだけでURLにアクセスしてアクセス結果をテキストファイルに保存し、指定文字のある行を抽出して、特定の文字でsplit(区切って)して配列のX番目だけ取り出したい瞬間がありませんか。私はありました。
想像の5倍はめんどうだった…。

コード

# url指定
$url = "https://noarts.net/files/tool/kindle-unlimited-serach.html"

# 出力先指定
$outfile = 'C:\aaa\res.txt'

# URLにアクセスして$outfileに保存(今回はhtml側にcharsetしてあってUTF-8でとってくれるのでエンコードは指定なし)
Invoke-WebRequest $url -OutFile $outfile

# uft-8のテキストファイルをutf-8として読み込み(エンコード指定したほうが文字化けしないです)
$lines = Get-Content -Encoding UTF8 $outfile

# 改行で区切って配列へ(-splitは.splitと違って正規表現が使えるらしい)
$lines = $lines -split '(\r\n|\n)'

# 一行ずつ処理
foreach ($line in $lines)
{
  # 「"」がある行を抽出(なぜかマルチバイト文字は検索してくれない…)
  if($line.IndexOf('"') -ne -1)
  {
    # 「"」で区切って配列に入れる
    $item = $line.split('"')
    # コンソールに0番目の配列を出力
    Write-host $item[0]
  }
}

出力結果

上のコードをaaa.ps1というファイル名で保存した場合、Powershellで「powershell -ExecutionPolicy Bypass ./aaa.ps1」とすると実行できます。
今回のファイルを実行すると下記のように出力されます。
元htmlと比較すると「”」のある行だけ抽出されて、splitで分割した「”」の前の部分が切り取れているのがわかると思います。

PS c\> powershell -ExecutionPolicy Bypass ./aaa.ps1
<html lang=
    <meta charset=
<link rel=
<div class=
    <h2 class=
    <input type=
    <input type=
    <div><a href=
<script src=
<script src=
<script async src=
<ins class=
     style=
     data-ad-client=
     data-ad-slot=
     data-ad-format=
     data-full-width-responsive=
<script src=
<script src=

おわり。