概要
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=
おわり。
