3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShellで長めの行を改行する

Last updated at Posted at 2020-12-11

何の話か

長めの行はなるべく改行入れてる。という話。

行長めの時
#長めの行
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON_orig, [System.Collections.Hashtable])

#長めの行はこんな風に改行を入れてる
$JSON_Obj = (
  New-Object System.Web.Script.Serialization.JavaScriptSerializer
).Deserialize(
  $JSON_Orig,
  [System.Collections.Hashtable]
)

長い行は嫌

PowerShellはコマンドレットの文字数が多く、パラメータの文字数が多く、パラメータの数が多く、何か詳しく書こうとすると簡単にエディタの右端から飛び出してしまう。
そこへC#の要素なんか加わると、もうどこが区切りか見通しが悪くて辛い。

行長めの時
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON_orig, [System.Collections.Hashtable])

シンタックスハイライトあるだろって? や、常に同じ環境で見られるわけじゃない。エディタや設定が自分好みでないよそのマシンや、最悪メモ帳しか使えないところで見ることもある。
辛い辛いという泣き言でない表現をすると、認知コストという限られた貴重な消費リソースをこういう事に支払いたくないのだ。

安価な解決法として、改行入れて見通しを良くする。

パイプの後ろで改行

PowerShell で長いコマンドを綺麗に書きたい

パイプ | の後ろにコマンドがない場合や、閉じ括弧 ) } によって括弧が閉じられていない場合など、コマンドが次の行に続くと解釈される。

パイプの後ろで改行は、何か読み込んでForEach-Objectへ送る時よくやる。2つ以上つなぐと(疲れてると特に)目が滑るので、改行するようにしている。

パイプの後ろで改行
#例
Get-Content -LiteralPath .\qiita.txt -Encoding Default | Where-Object{ $_ -eq "TEST" } | ForEach-Object{ Write-Output $_ }

#上と同じ
Get-Content -LiteralPath .\qiita.txt -Encoding Default |
Where-Object{ $_ -eq "TEST"} |
ForEach-Object{
  Write-Output $_
}

開き括弧やカンマの後ろで改行

パイプの後ろで改行と同様、開き括弧やカンマの後ろで改行を入れられる。
式が終わってないところなら改行できるので、さらにあちこちに改行することもできる。
あんまり改行多めだと逆にまとまりがなくなり把握しづらくなるので、開き括弧とカンマの後で改行する程度にしている。

行長めの時
#長めの行
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON_orig, [System.Collections.Hashtable])

#開き括弧の後ろで改行
$JSON_Obj = (
  New-Object System.Web.Script.Serialization.JavaScriptSerializer
).Deserialize(
  $JSON_orig, [System.Collections.Hashtable]
)

#開き括弧とカンマの後ろで改行
$JSON_Obj = (
  New-Object System.Web.Script.Serialization.JavaScriptSerializer
).Deserialize(
  $JSON_orig,
  [System.Collections.Hashtable]
)

#もっと開いてみる
$JSON_Obj =
(
  New-Object System.Web.Script.Serialization.JavaScriptSerializer
).
  Deserialize(
    $JSON_Orig,
    [System.Collections.Hashtable]
)

「もっと開いてみる」は具体的な言語にできないがなんとなくイヤ感がある。
ifを開きまくったときの「開きすぎじゃないのか?」な印象に似ている。

ifの波括弧前で改行
#if
$a = 1
$b = 2
if( $a -eq $b ){
  Write-Output "True"
}else{
  Write-Output "False"
}

#同じ
$a = 1
$b = 2
if(
  $a -eq $b
)
{
  Write-Output "True"
}
else
{
  Write-Output "False"
}

バッククォートで途中改行する

PowerShellはバッククォート ` で区切ると途中で改行できる。どこでも改行できるわけではなく、語の途中などはダメである。
この方法は手軽だが、どこでも区切れてしまうので意味のまとまりがぶったぎられてしまうので良くないように感じる。
変更があったときのtypo等も考えると、他に手が無いとき以外は使いたくない。

バッククォートで改行
#OK
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer`
).Deserialize($JSON_Orig, [System.Collections.Hashtable])

#OK
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).`
Deserialize($JSON_Orig, [System.Collections.Hashtable])

#これはダメ
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer)`
.Deserialize($JSON_Orig, [System.Collections.Hashtable])

#これもダメ
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScript`
Serializer).Deserialize($JSON_Orig, [System.Collections.Hashtable])
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?