tech.guitarrapc.cóm

Technical updates

「第3回シェル芸爆破デスマッチ勉強会&第21回餃子爆破定例会やってきた」をPowershellでやってみた

毎度おなじみのシェル芸ですが、第3回シェル芸があったとのことです。
第3回シェル芸爆破デスマッチ勉強会&第21回餃子爆破定例会やってきた
前回の挑戦はこちら
第2回チキチキ!シェル芸人養成勉強会をPowerShellでやってみた Hbstudy#38シェルスクリプトでいろいろやってみよう!をPowerShellでやってみた 「シェルスクリプト大喜利 第八回 ~”for,while禁止”に喜びを感じる人の何と多い事か!」をPowerShellでやってみた
早速やってみました。

前提

前回同様の縛りプレイです。
なるべく1ライナーで……敢えて、変数に収めるべきところすら、そのまま利用できるところは読みやすさを犠牲にパイプで繋ぐという制約で (おい
あ、繰り返しですが…一応。
※シェル環境前提なので、なるべくAliasを利用しているのはご了承ください。 ※私はAlias余り好きじゃない派です。 ※PowerShellとBashの大きな違いは | (パイプ)で渡されるのが文字列ではなくオブジェクトということを念頭に…
Get-ChildItem #ls
Get-Content #cat #gc
Foreach-Object #%
Where-Object #?
Measure-Object #measure

問題1 •  携帯電話の番号にハイフンを入れてみましょう。

まずは、ファイルを作ります。
@("09011112222","08098769876","09022221111") | Out-File .\1\tel.txt
ファイルが出来てますね。
09011112222
08098769876
09022221111

解法1. 普通に正規表現で

cat .\1\tel.txt | %{$_ -replace '(...)(....)(....)','$1-$2-$3'}

解法2. ごり押し文字抜出で

cat .\1\tel.txt | %{$_.Substring(0,3) + "-" + $_.Substring(3,4) + "-" + $_.Substring(7,4)}

解法3. 配列のjoinで

cat .\1\tel.txt | %{($_[0..2] -join "") + "-" + ($_[3..6] -join "") + "-" + ($_[7..10] -join "")}

結果表示です。いずれの解法も同じ結果です。

090-1111-2222
080-9876-9876
090-2222-1111

問題2 •  余計な文字を除去してハイフンを入れましょう。 (+81...は国内の番号表記に変換)

まずは、ファイルを作ります。
@("0901-1112222","電 話 番 号 :08098769876","+81-90-2222-1111") | Out-File .\2\tel2.txt
ファイルが出来てますね。
0901-1112222
電 話 番 号 :08098769876
+81-90-2222-1111

解法1. ふとすると、-replace 演算子で正規表現処理して、こう書いてしまいますが

cat .\2\tel2.txt | %{$_ -replace "\+81","0" | %{$_ -replace "-",""} | %{$_ -match "\d*$" | Out-Null; $Matches.Values -replace '(...)(....)(....)','$1-$2-$3'}}

解法2. -replaceに-replaceを重ねてもいいので

cat .\2\tel2.txt | %{$_ -replace "\+81","0" -replace "-",""} | %{$_ -match "\d*$" | Out-Null; $Matches.Values -replace '(...)(....)(....)','$1-$2-$3'}

解法3. 当然-matchも重ねていいので

cat .\2\tel2.txt | %{$_ -replace "\+81","0" -replace "-","" -match "\d*$" | Out-Null; $Matches.Values -replace '(...)(....)(....)','$1-$2-$3'}

解法4. Out-Nullは[void]してもいい、かつ-replace演算子ではなくreplaceメソッドでstring処理でもいいですね。

cat .\2\tel2.txt | %{[void]($_.replace("+81","0").replace("-","") -match "\d*$");$Matches.Values -replace '(...)(....)(....)','$1-$2-$3'}

結果表示です。いずれの解法も同じ結果です。

090-1111-2222
080-9876-9876
090-2222-1111

問題3 •  100行に水増ししてください。

まずは、ファイルを作ります。
"あ あ あ あ あ あ あ あ あ あ あ あ !" | Out-File .\3\hoge.txt
ファイルが出来てますね。
あ あ あ あ あ あ あ あ あ あ あ あ !

解法. 単純に増殖です。

1..100 | %{cat .\3\hoge.txt}

結果表示です。

あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !
あ あ あ あ あ あ あ あ あ あ あ あ !

問題4 •  カンマ、句点を全て全角の句点に 変換してください。

出題者様へ疑問です………あの、句点って"。"なんですが……、読点"、"とカンマ","を全角の句点"。"に置き換えるものとします。(逆も同じ要領なのでいいですよね)
まずは、ファイルを作ります。
"働けど、働けど,我が暮らし、楽にならず,JITコンパイラ。" | Out-File .\4\sakubun.txt
ファイルが出来てますね。
働けど、働けど,我が暮らし、楽にならず,JITコンパイラ。

解法1. 単純に-replace演算子で

cat .\4\sakubun.txt | %{$_ -replace ",","。" -replace ",","。" -replace "、","。"}

解法2. .replaceメソッドも同様です。

cat .\4\sakubun.txt | %{$_.replace(",","。").replace(",","。").replace("、","。")}

解法3. ハッシュテーブルで変換表を作っておくと、パターンが増えても平気ですね。

begin{$string=@{","="。";","="。";"、"="。"}}process{cat .\4\sakubun.txt | % {$result = $_;$string.GetEnumerator() | %{if (!$result -match $_.Keys){$result = $line -replace $_.Key,$_.Value}}}}end{$result}

解法3が分かりにくいから改行しろ?はい。

begin{
	$string=@{
	","="。"
	","="。"
	"、"="。"}
}
process{
	cat .\4\sakubun.txt | % {
		$result = $_;$string.GetEnumerator() | %{
			if (!$result -match $_.Keys)
			{
				$result = $line -replace $_.Key,$_.Value
			}
		}
	}
}
end{
	$result
}

begin{}process{}end{}を使わないとこうです。

$string=@{
	","="。"
	","="。"
	"、"="。"
}

cat .\4\sakubun.txt | % {
	$result = $_
	$string.GetEnumerator() | %{
		if (!$result -match $_.Keys)
		{
			$result = $line -replace $_.Key,$_.Value
		}
	}
	$result
}

結果表示です。いずれの解法も同じ結果です。

働けど。働けど。我が暮らし。楽にならず。JITコンパイラ。

問題5 •  次の変換を行ってください。 –  ¥_ を _ –  _ を半角空白

まずは、ファイルを作ります。
"\ ダッダーン\_! _ボヨヨン\_ボヨヨン_" | Out-File .\5\dadan.txt
ファイルが出来てますね。
\ ダッダーン\_! _ボヨヨン\_ボヨヨン_

解法1. -replace 演算子で正規表現処理

cat .\5\dadan.txt | %{$_ -replace "\\_","_" -replace "_"," "}

解法2. .replace メソッドでstring処理

cat .\5\dadan.txt | %{$_.replace("\_","_").replace("_"," ")}

結果表示です。いずれの解法も同じ結果です。

\ ダッダーン !  ボヨヨン ボヨヨン

問題6 •  文字数を数えてください。

まずは、ファイルを作ります。
"あいうえお`nかきくけこ" | Out-File .\6\aiueo.txt
ファイルが出来てますね。
あいうえお
かきくけこ

解法1. lengthをmeasureで

cat .\6\aiueo.txt | %{$_.length} | measure -sum

結果表示です。

Count    : 2
Average  :
Sum      : 10
Maximum  :
Minimum  :
Property :

解法2. .getenumerator()をmeasureで

cat .\6\aiueo.txt | %{$_.getenumerator()} | measure

解法3. [System.Linq.Enumerable]::ToArray()をmeasureで

cat .\6\aiueo.txt | %{[System.Linq.Enumerable]::ToArray($_)} | measure

結果表示です。解法2と3は同じ結果です。

Count    : 10
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

問題7 •  シバンを全て「#!/usr/local/bin/bash」 に変更してください

PowerShellなので、#required -Version 2.0を#required -Version 3.0に変更することにします。 まずは、ファイルを作ります。
@("a.ps1","b.ps1","c.ps1") | %{$file=$_;"#required -Version 2.0`necho hoge" | Out-File .\7\$file}
ファイルが出来てますね。
PS D:\document\program\powerShell\usp3> ls 7
	ディレクトリ: D:\document\program\powerShell\usp3\7
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/02/18     15:24         70 a.ps1
-a---        2013/02/18     15:24         70 b.ps1
-a---        2013/02/18     15:24         70 c.ps1
内容も問題ないようです。
#required -Version 2.0
echo hoge

解法1.バックアップを作らず差し替え。(ないわぁ)

普通にファイル操作で行うと…。
ls .\7\*.ps1 | %{$file=$_.Name; cat .\7\$file | %{$_ -replace "#required -Version 2.0","#required -Version 3.0"} | Out-File ./7/new_$file -Append;del .\7\$file; Ren ./7/new_$file $file }
あるいは、${ファイルパス}により、インプレース入れ替えもできます。が…フルパス指定を求められ、相対パスは利用できません。
@("a","b","c") | %{$ex1 ="{d:\7\$_.ps1}";$ex2 = "{d:\7\$_.ps1} -replace `"#required -Version 2.0`",`"#required -Version 3.0`"";Iex $"$ex1"=$"$ex2"}
絶対パスなど書いていられない場合はこれですね。
ls .\7\*.ps1 | %{$ex1 ="{$_}";$ex2 = "{$_} -replace `"#required -Version 2.0`",`"#required -Version 3.0`"";Iex $"$ex1"=$"$ex2"}

結果表示です。

PS D:\document\program\powerShell\usp3> ls .\7\

	ディレクトリ: D:\document\program\powerShell\usp3\7
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/02/18     15:30         72 a.ps1
-a---        2013/02/18     15:30         72 b.ps1
-a---        2013/02/18     15:30         72 c.ps1
差し替わっています。
PS D:\document\program\powerShell\usp3> cat .\7\a.ps1
#required -Version 3.0
echo hoge

解法2. オリジナルをそのままに、新しいファイルを、 new_として生成。

ls .\7\*.ps1 | %{$file=$_.Name; cat .\7\$file | %{$_ -replace "#required -Version 2.0","#required -Version 3.0"} | Out-File ./7/new_$file -Append;del .\7\$file; Ren ./7/new_$file $file }

結果表示です。

PS D:\document\program\powerShell\usp3> ls .\7\

	ディレクトリ: D:\document\program\powerShell\usp3\7
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/02/18     15:32         70 a.ps1
-a---        2013/02/18     15:32         70 b.ps1
-a---        2013/02/18     15:32         70 c.ps1
-a---        2013/02/18     15:32         72 new_a.ps1
-a---        2013/02/18     15:32         72 new_b.ps1
-a---        2013/02/18     15:32         72 new_c.ps1

オリジナルはそのままで

PS D:\document\program\powerShell\usp3> cat .\7\a.ps1
#required -Version 2.0
echo hoge

結果、新しいファイルができています。

PS D:\document\program\powerShell\usp3> cat .\7\new_a.ps1
#required -Version 3.0
echo hoge

解法3. オリジナルをbak_として残して、既存ファイル内容を差し替え。

ls .\7\*.ps1 | %{$file=$_.Name;copy .\7\$file .\7\bak_$file; del .\7\$file; cat .\7\bak_$file | %{$_ -replace "#required -Version 2.0","#required -Version 3.0"} | Out-File ./7/$file -Append }

結果表示です。

PS D:\document\program\powerShell\usp3> ls .\7\

	ディレクトリ: D:\document\program\powerShell\usp3\7
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/02/18     15:34         72 a.ps1
-a---        2013/02/18     15:34         72 b.ps1
-a---        2013/02/18     15:34         70 bak_a.ps1
-a---        2013/02/18     15:34         70 bak_b.ps1
-a---        2013/02/18     15:34         70 bak_c.ps1
-a---        2013/02/18     15:34         72 c.ps1
オリジナルが差し替わり
PS D:\document\program\powerShell\usp3> cat .\7\a.ps1
#required -Version 3.0
echo hoge
バックアップができています。
PS D:\document\program\powerShell\usp3> cat .\7\bak_a.ps1
#required -Version 2.0
echo hoge

解法3-2. オリジナルを$file_bak.ps1として残して、既存ファイル内容を差し替え。

拡張子の前に_bakと入れる場合は小細工をします。
ls .\7\*.ps1 | %{$file=$_.Name;$bakfile=($_.BaseName + "_bak" + $_.Extension); copy .\7\$file .\7\$bakfile; del .\7\$file; cat .\7\$bakfile | %{$_ -replace "#required -Version 2.0","#required -Version 3.0"} | Out-File ./7/$file -Append }

結果表示です。

PS D:\document\program\powerShell\usp3> ls .\7\

	ディレクトリ: D:\document\program\powerShell\usp3\7

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/02/18     15:38         72 a.ps1
-a---        2013/02/18     15:38         70 a_bak.ps1
-a---        2013/02/18     15:38         72 b.ps1
-a---        2013/02/18     15:38         70 b_bak.ps1
-a---        2013/02/18     15:38         72 c.ps1
-a---        2013/02/18     15:38         70 c_bak.ps1
 
オリジナルが差し替わり
PS D:\document\program\powerShell\usp3> cat .\7\a.ps1
#required -Version 3.0
echo hoge
バックアップができています。
PS D:\document\program\powerShell\usp3> cat .\7\a_bak.ps1
#required -Version 2.0
echo hoge

問題8 •  table中のデータをスペース区切りで 抜き出してください。

まずは、ファイルを作ります。 どうせ作るなら、タグ打ちではなく、ConvertTo-HTMLを利用しましょう。
$a=[PScustomObject]@{data="a";data2="b";data3="c"};
$b=[PScustomObject]@{num=1;num2=2;num3=3};
$html = $a | ConvertTo-Html -Fragment -As Table | %{ $_ -replace "<colgroup>.*</colgroup>","" -replace "<tr><th>.*</th></tr>","" -replace "</table>",""} | Select-String -Pattern "\S" | %{$_.line}
$html += $b| ConvertTo-Html -Fragment -As Table | %{ $_ -replace "<colgroup>.*</colgroup>","" -replace "<tr><th>.*</th></tr>","" -replace "<table>",""} | Select-String -Pattern "\S" | %{$_.line}
$html | Out-File .\8\hoge.html
ファイルが出来てますね。
<table>
<tr><td>a</td><td>b</td><td>c</td></tr>
<tr><td>1</td><td>2</td><td>3</td></tr>
</table>

解法1. whereから正規表現マッチ結果を受けて残ったタグのみreplace処理。

cat .\8\hoge.html | ?{$_ -match "<tr>(?<data>.*)</tr>"} | %{$Matches.data.replace("<td>","").replace("</td>"," ") }

解法2. trでsplitしてから、whereで正規表現マッチ、結果を受けて残ったタグのみreplace処理。

cat .\8\hoge.html | %{$_ -split "<tr>" | ?{$_ -match "(?<data>.*)</tr>"}| %{$Matches.data.Replace("<td>","").replace("</td>"," ")}}

解法3. 読み込み時にSelect-Stringで正規表現マッチ、結果を受けて残ったタグをreplace処理。

Select-String -Path .\8\hoge.html -Pattern "<tr>.*</tr>" | %{$_.line.replace("<tr>","").replace("</tr>","").replace("<td>","").replace("</td>"," ")}

解法4. 解法3の読み込み時のSelect-Stringにおける正規表現マッチは実はこれでもいいわけで。

Select-String -Path .\8\hoge.html -Pattern "<tr>.*" | %{$_.line.replace("<tr>","").replace("</tr>","").replace("<td>","").replace("</td>"," ")}

解法5. ちなみに問題の解法例にあったような改行を無くしてからの処理はこんなに面倒になります。

New-Object IO.StreamReader((Convert-Path .\8\hoge.html),[text.Encoding]::Default) | %{$_.ReadToEndAsync().Result } | %{$_.replace("`r`n","").replace("<table>","").replace("</table>","").replace("<tr>","").replace("</tr>","`r`n").replace("<td>","").replace("</td>"," ")}

結果表示です。いずれの解法も同じ結果です。

※わざわざa b cと1 2 3を別の行に出るように調整してますのであしからず。(正直同一行の方が簡単だったのですが…問題が別の行指定のようだったので)
a b c
1 2 3

問題9 •  aliasを解除してください。

まずは、Aliasを作ります。
Set-Alias l ls
Set-Alias l1 ls
Set-Alias l2 ls
Set-Alias l3 ls
Aliasが出来てますね。
PS D:\document\program\powerShell\usp3> @("",1,2,3) | %{ Get-Alias "l$_"}

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Alias           l -> Get-ChildItem
Alias           l1 -> Get-ChildItem
Alias           l2 -> Get-ChildItem
Alias           l3 -> Get-ChildItem
ユーザー定義のalias全てを指定するには、次の条件で出来そうです。(単純に作ったものだけなら上記のでいいのですが)
Get-Alias | ?{$_.Options -eq "None" -and $_.HelpUri -eq ""}

解法. 指定したAliasをaliasのpsdriveから削除

Get-Alias | ?{$_.Options -eq "None" -and $_.HelpUri -eq ""} | %{Remove-Item alias:$_}

結果表示です。きっちり消えています。

PS D:\Document\Program\Powershell\usp3> @("",1,2,3) | %{ Get-Alias "l$_"}

Get-Alias : name 'l' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。
発生場所 行:1 文字:18
+ @("",1,2,3) | %{ Get-Alias "l$_"}
+                  ~~~~~~~~~~~~~~~
	+ CategoryInfo          : ObjectNotFound: (l:String) [Get-Alias], ItemNotFoundException
	+ FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand

Get-Alias : name 'l1' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。
発生場所 行:1 文字:18
+ @("",1,2,3) | %{ Get-Alias "l$_"}
+                  ~~~~~~~~~~~~~~~
	+ CategoryInfo          : ObjectNotFound: (l1:String) [Get-Alias], ItemNotFoundException
	+ FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand

Get-Alias : name 'l2' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。
発生場所 行:1 文字:18
+ @("",1,2,3) | %{ Get-Alias "l$_"}
+                  ~~~~~~~~~~~~~~~
	+ CategoryInfo          : ObjectNotFound: (l2:String) [Get-Alias], ItemNotFoundException
	+ FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand

Get-Alias : name 'l3' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。
発生場所 行:1 文字:18
+ @("",1,2,3) | %{ Get-Alias "l$_"}
+                  ~~~~~~~~~~~~~~~
	+ CategoryInfo          : ObjectNotFound: (l3:String) [Get-Alias], ItemNotFoundException
	+ FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand

問題10 •  以下の部分だけ抽出してください。 –  %%1%% と %%2%% の間 –  %%3%% と %%4%% の間

まずはファイルを作ります。
"%%1%%`n`t私はだれ?`n%%2%%`n`tナタデココ`n%%3%%`n`tここはどこ?`n%%4%%`n`tなかったでココに。`n%%5%%" | Out-File .\10\coco.txt
ヒアストリングを使ってもいいですね。
@"
%%1%%
`t私はだれ?
%%2%%
`tナタデココ
%%3%%
`tここはどこ?
%%4%%
`tなかったでココに。
%%5%%
"@ | Out-File .\10\coco.txt
ファイルが出来てますね。
PS D:\Document\Program\Powershell\usp3> cat .\10\coco.txt
%%1%%
	私はだれ?
%%2%%
	ナタデココ
%%3%%
	ここはどこ?
%%4%%
	なかったでココに。
%%5%%

解法1. 文字行だけにしてから、行を指定

cat .\10\coco.txt | ?{$_ -notmatch "%%.*"} | Select-String -Pattern "\S" | ?{$_.LineNumber -eq 1 -or $_.LineNumber -eq 3}

解法2. 初めから行を指定

Select-String -Path .\10\coco.txt -Pattern "\S" | ?{$_.LineNumber -eq 2 -or $_.LineNumber -eq 6} | select -ExpandProperty line

解法3. いや、?含んだ行じゃ (おい

cat .\10\coco.txt | ?{$_ -match ".*?" }

結果表示です。きっちり消えています。

	私はだれ?
	ここはどこ?
※本来は行間を指定するべきですが飽きたので……すいません。

延長戦 •  精度よく足してください (答え:3150101.7933532523523)

まずはファイルを作ります。
@([string]0.1243532523523,[string]-1251.331,[string]3151353) | Out-File .\延長戦\num.txt
ファイルが出来てますね。
PS D:\Document\Program\Powershell\usp3> cat .\延長戦\num.txt
0.1243532523523
-1251.331
3151353
あれ?……あ、ギブアップで…?えっと、桁落ちが防げない……。 [double]も[decimal]もToString(G17)もダメらしく…
#doubleにキャスト
cat .\延長戦\num.txt | %{[double]$_} | measure -sum
#decimalにキャスト
cat .\延長戦\num.txt | %{[decimal]$_} | measure -sum
#ToString(G17)
$a = cat .\延長戦\num.txt | %{[decimal]$_} | measure -sum
$a.sum.ToString("G17")
結果表示です。桁落ちしていますね…。
3150101.79335325 #double
3150101.79335325 #decimal
3150101.7933532526 #ToString(G17)
※一桁ずつ足して[string]しかないのかなぁ…? どうやら、measureがdoubleであることを見落としていましたww 牟田口先生から、単純に[decimal]にキャストで桁落ちせずに足せることを指摘いただきましたー。 ってことでこれ。
cat .\延長戦\num.txt | %{$result=0}{[decimal]$result+=$_}{$result}
あるいは数値リテラルでこれとか。
0.1243532523523d-1251.331+3151353
それかこれ。
[decimal]0.1243532523523-1251.331+3151353
結果表示です。大丈夫ですね。measure -sumは注意でした。
PS D:\Document\Program\Powershell\usp3> cat .\延長戦\num.txt | %{$result=0}{[decimal]$result += $_ }{$result}
3150101.7933532523523
PowerShellは、明示しないと暗黙でdoubleに型変換されるので注意です。
0.1243532523523-1251.331+3151353 #これはdoubleになり桁落ちする

まとめ

ちょっ、あれ?延長戦で…ぐぬぬぬ…先生、素敵な回答プリーズ? 私のTLは、怖いけど頼れる先生方が多くて嬉しい限りです!