以下の内容はhttps://tech.guitarrapc.com/entry/2013/02/18/070226より取得しました。


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

毎度おなじみのシェル芸ですが、第3回シェル芸があったとのことです。

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

前回の挑戦はこちら

早速やってみました。

前提

前回同様の縛りプレイです。 なるべく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&gt>" -replace "&l>&gt>lt>>&l>r&>,"" -repla>",""}>elect>ing -Pattern "\S" | %{$.line} $html += $b| ConvertTo-Html -Fragment -As Table | %{ $ -replace ".*</colgroup&gt>" -replace "&l>&gt>lt>>&l>r&>,"" -repla>",""}>elect>ing -Pattern "\S" | %{$.line} $html | Out-File .\8\hoge.html


ファイルが出来てますね。
t;/td>&l>>>t;>gt;lt;/td>>;/tr>>>> t;/td>&l>>>t;>gt;lt;/td>>;/tr>>>>


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

cat .\8\hoge.html | ?{$_ -match "(?<data&gt>"}>{$Matches.data.replace("<td&gt>")>lace("",> }>


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

cat .\8\hoge.html | %{$ -split "" | ?{$ -match "(?<data&gt>"}>$Matches.data.Replace("<td&gt>")>lace("",>}}>


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

Select-String -Path .\8\hoge.html -Pattern ".*</tr&gt> %{$_.line.replace("",>replace("</tr&gt>")>lace("",>re>e(""," ">


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

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


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

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


#### 結果表示です。いずれの解法も同じ結果です。
※わざわざ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%%nt私はだれ?n%%2%%ntナタデココn%%3%%ntここはどこ?n%%4%%ntなかったでココに。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)


<del datetime="2013-02-18T08:13:10+00:00">※一桁ずつ足して[string]しかないのかなぁ…?</del>

どうやら、measureがdoubleであることを見落としていましたww
牟田口先生から、単純に[decimal]にキャストで桁落ちせずに足せることを指摘いただきましたー。

[牟田口大介さん (@mutaguchi)](https://twitter.com/mutaguchi/status/303416603083669504)

ってことでこれ。

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になり桁落ちする



## まとめ
<del datetime="2013-02-18T08:13:10+00:00">ちょっ、あれ? 延長戦で…ぐぬぬぬ…先生、素敵な回答プリーズ?</del>
私のTLは、怖いけど頼れる先生方が多くて嬉しい限りです!



以上の内容はhttps://tech.guitarrapc.com/entry/2013/02/18/070226より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14



",>re>e("