【PowerShell】【book】「Windows PowerShellクックブック」の学習記録

下記の「Windows PowerShellクックブック」を使った学習記録のページです。

Windows PowerShellクックブック

Windows PowerShellクックブック

  • 作者: Lee Holmes,マイクロソフト株式会社ITプロエバンジェリストチーム(監訳),菅野良二
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/10/23
  • メディア: 大型本
  • 購入: 4人 クリック: 72回
  • この商品を含むブログ (15件) を見る


I部 PowerShellの基本
1章 Windows PowerShellインタラクティブシェル
 はじめに
 レシピ1.1 プログラム、スクリプト、既存のツールを実行する
 レシピ1.2 PowerShellコマンドを実行する
   Get-Process.ps1
 レシピ1.3 シェル、プロファイル、プロンプトをカスタマイズする
   Microsoft.PowerShell_profile_1.ps1
   Microsoft.PowerShell_profile_2.ps1
   profile_prompt.ps1
 レシピ1.4 コマンドを見つけてタスクを遂行する
 レシピ1.5 コマンドに関するヘルプを取得する
 レシピ1.6 プログラム:ヘルプからテキストを検索する
 レシピ1.7 PowerShellの外からPowerShellスクリプトを呼び出す
 レシピ1.8 プログラム:バッチファイルによって設定された環境変数の変更を保持する
 レシピ1.9 システム日時を取得する
   Get-Date_1.ps1
   Get-Date_2.ps1
 レシピ1.10 最後に実行したコマンドのステータスを確認する
 レシピ1.11 コマンドの継続時間を測定する
 レシピ1.12 シェルをカスタマイズして生産性を上げる
 レシピ1.13 プログラム:よく使うコマンドのエイリアスを知る
 レシピ1.14 コンソール履歴へのアクセスとその管理
 レシピ1.15 コマンドの出力をファイルに格納する
   Out-File-Width_Get-ChildItem_1.ps1
   Out-File_Get-ChildItem_1.ps1
 レシピ1.16 情報をファイルの末尾に追加する
 レシピ1.17 シェルセッションのトランスクリプトを記録する
   Start-Transcript.ps1
 レシピ1.18 項目の各種プロパティをリストとして表示する
 レシピ1.19 項目のプロパティを表として表示する
   Format-Table_1.ps1
   Format-Table_2.ps1
   Format-Table_3.ps1
   Format-Table_4.ps1
 レシピ1.20 コマンドのエラー出力を管理する
 レシピ1.21 デバッグ、詳細表示、進行状況の出力を構成する
 レシピ1.22 追加のスナップインを使ってシェルを拡張する
 レシピ1.23 コンソールファイルを使用してスナップインのセットをロードして保存する

2章 パイプライン
 はじめに
 レシピ2.1 リストまたはコマンド出力の項目をフィルタリングする
   Where-Object_Get-ChildItem_1.ps1
   Where-Object_Get-Process_1.ps1
   Where-Object_Get-Process_2.ps1
   Where-Object_Get-Process_3.ps1
 レシピ2.2 プログラム:ほとんどのWhere-Objectフィルタを簡素化する
   Compare-Property.ps1
   Test_Get-ChildItem.ps1
   Test_Get-Process.ps1
 レシピ2.3 プログラム:オブジェクトのリストをインタラクティブにフィルタリングする
 レシピ2.4 リストまたはコマンド出力の項目を処理する
   Foreach-Object_seq.ps1
 レシピ2.5 大量のデータを扱うタスクを自動化する

3章 変数とオブジェクト
 はじめに
 レシピ3.1 情報を変数に格納する
   Get-Process_count.ps1
 レシピ3.2 環境変数にアクセスする
 レシピ3.3 変数やその他の項目に関するアクセスとスコープを制御する
 レシピ3.4 .NETオブジェクトを利用する
   System.Diagnostics.Process=GetProcessById.ps1
   System.Environment=CurrentDirectory.ps1
 レシピ3.5 .NETオブジェクトのインスタンスを作成する
 レシピ3.6 プログラム:ジェネリック型のオブジェクトのインスタンスを作成する
 レシピ3.7 長いクラス名を入力する労力を減らす
 レシピ3.8 COMオブジェクトを使用する
 レシピ3.9 型とオブジェクトについて知る
 レシピ3.10 型とオブジェクトに関する詳細なドキュメントを得る
 レシピ3.11 カスタムのメソッドやプロパティをオブジェクトに追加する
 レシピ3.12 カスタムのメソッドやプロパティを型に追加する

4章 ループ処理とフロー制御
 はじめに
 レシピ4.1 比較演算子と論理演算子を使って判断を下す
   like_1.ps1
   like_2.ps1
   like_3.ps1
   like_4.ps1
   match_1.ps1
   match_2.ps1
 レシピ4.2 条件ステートメントを使用してスクリプトの流れを制御する
   elseif.ps1
 レシピ4.3 大規模な条件ステートメントをスイッチを使って管理する
   switch.ps1
 レシピ4.4 ループを使って操作を繰り返す
 レシピ4.5 一時停止または遅延を追加する

5章 文字列と非構造化テキスト
 はじめに
 レシピ5.1 文字列を作成する
 レシピ5.2 複数行の文字列または書式設定された文字列を作成する
   heredocument.ps1
   null.ps1
 レシピ5.3 文字列内に特殊文字を含める
 レシピ5.4 動的な情報を文字列に挿入する
   dynamic_string_1.ps1
   dynamic_string_2.ps1
 レシピ5.5 文字列内に動的な情報が含まれないようにする
 レシピ5.6 書式設定された情報を文字列に配置する
 レシピ5.7 文字列からテキストまたはパターンを検索する
   Contains.ps1
 レシピ5.8 文字列内のテキストを置換する
   Replace_1.ps1
   Replace_2.ps1
 レシピ5.9 文字列を大文字/小文字に変換する
 レシピ5.10 文字列を取り除く
 レシピ5.11 出力のために日付形式を設定する
 レシピ5.12 プログラム:テキストストリームをオブジェクトに変換する
 レシピ5.13 大きなレポートやテキストストリームを生成する

6章 計算と算術
 はじめに
 レシピ6.1 簡単な計算を実行する
 レシピ6.2 複雑な計算を実行する
 レシピ6.3 リストの統計プロパティを測定する
 レシピ6.4 数字を2進数として扱う
 レシピ6.5 管理用の定数を使って算術を簡素化する
 レシピ6.6 基数間で数字を変換する

II部 一般的なタスク
7章 単純なファイル
 はじめに
 レシピ7.1 ファイルの中身を取得する
   Get-Content_1.ps1
   Get-Content_head_2.ps1
   Get-Content_line3-10_4.ps1
   Get-Content_tail_3.ps1
   System.IO.File=ReadAllText.ps1
 レシピ7.2 ファイルからテキストまたはパターンを検索する
   Select-String_Filter.ps1
   Select-String_Simple.ps1
   Select-String_regex.ps1
 レシピ7.3 テキストベースのログファイルの解析と管理
 レシピ7.4 バイナリファイルの解析と管理
 レシピ7.5 一時ファイルを作成する
   System.IO.Path=GetTempFileName.ps1
 レシピ7.6 ファイル内でテキストの検索/置換を行う

8章 構造化ファイル
 はじめに
 レシピ8.1 XMLファイルの情報にアクセスする
   get-contet-xml.ps1
   sample.xml
 レシピ8.2 XMLファイルに対してXPathクエリを実行する
 レシピ8.3 XMLファイルのデータを修正する
   sample.xml
   save-content-xml.ps1
 レシピ8.4 構造化データを簡単にインポート/エクスポートする
 レシピ8.5 コマンドの出力をCSVファイルに格納する
 レシピ8.6 CSVファイルから構造化データをインポートする
 レシピ8.7 Excelを使ってコマンド出力を管理する

9章 インターネット対応スクリプト
 はじめに
 レシピ9.1 インターネットからファイルをダウンロードする
   System.Net.WebClient.ps1
   System.Net.WebClient_By_IE.ps1
 レシピ9.2 インターネットからWebページをダウンロードする
 レシピ9.3 プログラム:Get-PageUrls
 レシピ9.4 プログラム:Connect-WebService
 レシピ9.5 コマンド出力をWebページとしてエクスポートする
 レシピ9.6 プログラム:電子メールを送信する
 レシピ9.7 プログラム:インターネットプロトコルとのやり取り

10章 コードの再利用
 はじめに
 レシピ10.1 スクリプトを記述する
 レシピ10.2 関数を記述する
 レシピ10.3 スクリプトブロックを記述する
 レシピ10.4 スクリプト、関数、スクリプトブロックからデータを返す
 レシピ10.5 共通関数をライブラリ内に配置する
 レシピ10.6 スクリプト、関数、スクリプトブロックの引数にアクセスする
 レシピ10.7 パイプライン入力にアクセスする
 レシピ10.8 コマンドレットのキーワードを使ってパイプライン指向のスクリプトを記述する
 レシピ10.9 パイプライン指向の関数を記述する

11章 リスト、配列、ハッシュテーブル
 はじめに
 レシピ11.1 項目の配列またはリストを作成する
   New-Object_ArrayList_1.ps1
   New-Object_ArrayList_2.ps1
   New-Object_ArrayList_3.ps1
   array_1.ps1
   array_2.ps1
   array_3.ps1
 レシピ11.2 ジャグ配列または多次元配列を作成する
 レシピ11.3 配列の要素にアクセスする
 レシピ11.4 配列の個々の要素にアクセスする
 レシピ11.5 項目の配列またはリストをソートする
 レシピ11.6 配列に項目が含まれているかどうかを知る
 レシピ11.7 2つの配列を結合する
   array_contains.ps1
 レシピ11.8 ある値とマッチする項目を配列から検索する
   array_eq.ps1
   array_like.ps1
   array_match.ps1
 レシピ11.9 配列から要素を削除する
 レシピ11.10 ある値より大きい(または小さい)項目を配列から検索する
 レシピ11.11 配列に関する高度なタスクにArrayListクラスを使用する
 レシピ11.12 ハッシュテーブル(連想配列)を作成する
   hash.ps1
   hash_1.ps1
   hash_2.ps1
 レシピ11.13 キーまたは値でハッシュテーブルをソートする
   hash_sort.ps1

12章 ユーザーとの対話
 はじめに
 レシピ12.1 1行のユーザー入力を読み取る
   Read-Host.ps1
 レシピ12.2 ユーザーが入力したキーを読み取る
   Console=ReadKey_anychar.ps1
   Console=ReadKey_pause.ps1
 レシピ12.3 プログラム:ユーザーにメニューを表示する
 レシピ12.4 ユーザーにメッセージと出力を表示する
 レシピ12.5 実行時間の長いタスクの進行状況を表示する
 レシピ12.6 文化圏を意識したスクリプトを記述する
 レシピ12.7 プログラム:代替の文化圏設定を使ってスクリプトブロックを呼び出す
 レシピ12.8 ホストのユーザーインターフェイスの機能にアクセスする
 レシピ12.9 プログラム:グラフィカルユーザーインターフェイスをスクリプトに追加する

13章 トレースとエラー管理
 はじめに
 レシピ13.1 コマンドから発生するエラーを表示する
 レシピ13.2 警告、エラー、終了するエラーを処理する
 レシピ13.3 警告、エラー、終了するエラーを出力する
 レシピ13.4 スクリプトをデバッグする
 レシピ13.5 スクリプトやコマンドの詳細なトレースを収集する
 レシピ13.6 プログラム:スクリプトのパフォーマンスプロファイルを分析する

14章 実行環境の認識
 はじめに
 レシピ14.1 環境変数の表示と修正
 レシピ14.2 コマンドの呼び出しに関する情報にアクセスする
 レシピ14.3 プログラム:$myInvocation変数を調べる
 レシピ14.4 スクリプトの名前を知る
 レシピ14.5 スクリプトの場所を知る
   myInvocation.ScriptName.ps1
 レシピ14.6 システムパスの場所を知る
 レシピ14.7 プログラム:[スタート]メニューを検索する
 レシピ14.8 現在の場所を取得する
   Get-location.ps1
 レシピ14.9 各コンポーネントからファイルパスを安全に作成する
 レシピ14.10 PowerShellのグローバル環境を取り扱う

15章 Windows PowerShellの適用範囲を広げる
 はじめに
 レシピ15.1 Windows Management Instrumentationデータにアクセスする
 レシピ15.2 プログラム:WMIフィルタで利用可能なプロパティを知る
 レシピ15.3 プログラム:WMIクラスを検索する
 レシピ15.4 .NETを使って高度なWMIタスクを実行する
 レシピ15.5 VBScript WMIスクリプトをPowerShellに変換する
 レシピ15.6 COMスクリプティングインターフェイスを使ってプログラムを自動化する
 レシピ15.7 プログラム:SQLデータソースに問い合わせる
 レシピ15.8 Windowsパフォーマンスカウンタにアクセスする
 レシピ15.9 プログラム:ネイティブなWindows API呼び出しを実行する
 レシピ15.10 プログラム:インラインC#をPowerShellスクリプトに追加する
 レシピ15.11 .NET SDKライブラリにアクセスする
 レシピ15.12 独自のPowerShellコマンドレットを作成する
 レシピ15.13 PowerShellスクリプティングを自分のプログラムに追加する

16章 セキュリティとスクリプト署名
 はじめに
 レシピ16.1 実行ポリシーを通じてスクリプティングを有効にする
 レシピ16.2 PowerShellスクリプトファイルまたは書式設定ファイルに署名する
 レシピ16.3 プログラム:自己証明書を作成する
 レシピ16.4 エンタープライズでPowerShellセキュリティを管理する
 レシピ16.5 PowerShellスクリプトのデジタル署名を確認する
 レシピ16.6 機密情報を安全に扱う
 レシピ16.7 ユーザー名とパスワードを安全に要求する
 レシピ16.8 プログラム:別のユーザーとしてプロセスを開始する
 レシピ16.9 資格情報をディスクに安全に格納する
 レシピ16.10 ユーザーおよびマシンの証明書にアクセスする
 レシピ16.11 プログラム:証明書ストアを検索する

III部 管理者タスク
17章 ファイルとディレクトリ
 はじめに
 レシピ17.1 特定の日付以前に修正されたすべてのファイルを見つける
   Get-ChildItem_find_ctime.ps1
   Get-ChildItem_find_newrmt.ps1
 レシピ17.2 ファイルをクリアまたは削除する
   Clear-Content.ps1
 レシピ17.3 ファイルの属性の管理や変更を行う
   file_Attributes.ps1
 レシピ17.4 ディレクトリ内のファイルを取得する
 レシピ17.5 パターンとマッチするファイルを見つける
   Get-ChildItem_find_d.ps1
   Get-ChildItem_find_f.ps1
   Get-ChildItem_find_f_and_d.ps1
 レシピ17.6 名前に特殊文字が含まれているファイルを管理する
 レシピ17.7 プログラム:ディスク使用率に関する情報を取得する
 レシピ17.8 現在の場所を知る
   Join-Path.ps1
   Resolve-Path.ps1
 レシピ17.9 ファイルの変更を監視する
   Get-Content_wait.ps1
 レシピ17.10 プログラム:ファイルのMD5ハッシュまたはSHA1ハッシュを取得する
 レシピ17.11 ディレクトリを作成する
   New-Item_Directory.ps1
 レシピ17.12 ファイルまたはディレクトリを削除する
   Remove-Item.ps1
 レシピ17.13 ファイルまたはディレクトリの名前を変更する
   Rename-Item-1.ps1
   Rename-Item-2.ps1
   Rename-Item-3.ps1
 レシピ17.14 ファイルまたはディレクトリを移動する
   Move-Item-1.ps1
 レシピ17.15 ファイルまたはディレクトリのACLを取得する
 レシピ17.16 ファイルまたはディレクトリのACLを設定する
 レシピ17.17 プログラム:拡張ファイルプロパティをファイルに追加する
 レシピ17.18 プログラム:ファイルシステムのハードリンクを作成する
 レシピ17.19 プログラム:ZIPアーカイブを作成する

18章 Windowsレジストリ
 はじめに
 レシピ18.1 レジストリに移動する
 レシピ18.2 レジストリキーを表示する
 レシピ18.3 レジストリキーの値を修正または削除する
 レシピ18.4 レジストリキーの値を作成する
 レシピ18.5 レジストリキーを削除する
 レシピ18.6 サイトをInternet Explorerセキュリティゾーンに追加する
 レシピ18.7 Internet Explorer設定を修正する
 レシピ18.8 プログラム:Windowsレジストリを検索する
 レシピ18.9 レジストリキーのACLを取得する
 レシピ18.10 レジストリキーのACLを設定する
 レシピ18.11 リモートコンピュータのレジストリを操作する
 レシピ18.12 プログラム:リモートマシンからレジストリ項目を取得する
 レシピ18.13 プログラム:リモートレジストリキーのプロパティを取得する
 レシピ18.14 プログラム:リモートレジストリキーのプロパティを設定する
 レシピ18.15 プログラムのレジストリ設定を見つける

19章 データの比較
 はじめに
 レシピ19.1 2つのコマンドの出力を比較する
   Compare-Object.ps1
 レシピ19.2 2つのファイルの違いを知る
   Compare-Object_2.ps1
 レシピ19.3 ファイルセットの整合性を検証する
   Compare-Object_3.ps1

20章 イベントログ
 はじめに
 レシピ20.1 すべてのイベントログをリストする
 レシピ20.2 イベントログから最新のエントリを取得する
 レシピ20.3 特定のテキストを持つイベントログエントリを見つける
 レシピ20.4 特定のイベントログエントリを取得する
 レシピ20.5 頻度別にイベントログエントリを検索する
 レシピ20.6 イベントログをバックアップする
 レシピ20.7 イベントログを作成または削除する
 レシピ20.8 イベントログに書き込む
 レシピ20.9 リモートマシンのイベントログにアクセスする

21章 プロセス
 はじめに
 レシピ21.1 現在実行中のプロセスをリストする
 レシピ21.2 プロセスを起動する
 レシピ21.3 プロセスを停止する
 レシピ21.4 プログラム:リモートマシンでPowerShellの式を実行する

22章 システムサービス
 はじめに
 レシピ22.1 現在実行中のサービスをリストする
 レシピ22.2 実行中のサービスを管理する
 レシピ22.3 リモートマシンのサービスにアクセスする

23章 Active Directory
 はじめに
 レシピ23.1 ローカルなインストール環境でActive Directoryスクリプトをテストする
 レシピ23.2 組織単位(OU)を作成する
 レシピ23.3 組織単位のプロパティを取得する
 レシピ23.4 組織単位のプロパティを修正する
 レシピ23.5 Active Directoryコンテナの子を取得する
 レシピ23.6 ユーザーアカウントを作成する
 レシピ23.7 プログラム:Active Directoryにユーザーを一括してインポートする
 レシピ23.8 ユーザーアカウントを検索する
 レシピ23.9 ユーザーアカウントのプロパティを取得する
 レシピ23.10 ユーザーアカウントのプロパティを修正する
 レシピ23.11 セキュリティグループまたは配布グループを作成する
 レシピ23.12 セキュリティグループまたは配布グループを検索する
 レシピ23.13 グループのプロパティを取得する
 レシピ23.14 グループの所有者を見つける
 レシピ23.15 セキュリティグループまたは配布グループのプロパティを修正する
 レシピ23.16 ユーザーをセキュリティグループまたは配布グループに追加する
 レシピ23.17 ユーザーをセキュリティグループまたは配布グループから削除する
 レシピ23.18 ユーザーのグループメンバシップをリストする
 レシピ23.19 グループのメンバをリストする
 レシピ23.20 組織単位のユーザーをリストする
 レシピ23.21 コンピュータアカウントを検索する
 レシピ23.22 コンピュータアカウントのプロパティを取得する

24章 企業のコンピュータ管理
 はじめに
 レシピ24.1 プログラム:ユーザーのログオン/ログオフスクリプトをリストする
 レシピ24.2 プログラム:マシンのスタートアップ/シャットダウンスクリプトをリストする
 レシピ24.3 Windowsファイアウォールを有効または無効にする
 レシピ24.4 Windowsファイアウォール内でポートの開閉を行う
 レシピ24.5 プログラム:インストールされているすべてのソフトウェアをリストする
 レシピ24.6 アプリケーションをアンインストールする
 レシピ24.7 コンピュータのスケジュールされたタスクを管理する
 レシピ24.8 プリンタ情報を取得する
 レシピ24.9 プリンタキューの統計を取得する
 レシピ24.10 プリンタと印刷キューを管理する
 レシピ24.11 ホットフィクスがインストールされているかどうかを知る
 レシピ24.12 プログラム:システムに関するサマリー情報を表示する
 レシピ24.13 DHCPリースを更新する
 レシピ24.14 静的IPアドレスを割り当てる
 レシピ24.15 コンピュータのすべてのIPアドレスをリストする
 レシピ24.16 ネットワークアダプタのプロパティをリストする

25章 Exchange Server 2007の管理
 はじめに
 レシピ25.1 Exchange管理シェルを試す
 レシピ25.2 ウィザードによるタスクを自動化する
 レシピ25.3 Exchangeユーザーを管理する
 レシピ25.4 メールボックスを管理する
 レシピ25.5 配布グループを管理する
 レシピ25.6 トランスポートルールを管理する
 レシピ25.7 Outlook Web Accessを管理する

26章 Operations Manager 2007の管理
 はじめに
 レシピ26.1 Operations Managerコマンドシェルを試す
 レシピ26.2 Operations Managerエージェントを管理する
 レシピ26.3 メンテナンスウィンドウをスケジュールする
 レシピ26.4 管理パックの取得、インストール、アンインストールを行う
 レシピ26.5 ルールを有効または無効にする
 レシピ26.6 タスクをリストして開始する
 レシピ26.7 アラートを管理する

 
 

1.15

 

Out-File-Width_Get-ChildItem_1.ps1
#!/usr/bin/env pwsh

# 各行 40文字のみしか表示しない (41文字目移行は削除される)
Get-ChildItem | Out-File -Width 20 list.txt

 

Out-File_Get-ChildItem_1.ps1
#!/usr/bin/env pwsh

Get-ChildItem | Out-File list.txt

 
 

1.17

 

Start-Transcript.ps1
#!/usr/bin/env pwsh
# Linux の script コマンドに相当する Start-Transcript , Stop-Transcript の使用例.
# Get-Process 呼び出し部分を含めてログ取得する.

Start-Transcript /tmp/aaa

Get-Process | Where-Object {$_.WorkingSet -gt 100MB} | Sort-Object -Descending  WS<Paste>

Stop-Transcript

 
 

1.19

 

Format-Table_1.ps1
#!/usr/bin/env pwsh

# Get-Process コマンドの結果より、Format-Table を使って特定の項目を抽出する
#
# NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
# ------    -----      -----     ------      --  -- -----------
#      0     0.00       2.50       0.00     828 827 (sd-pam)
#      0     0.00       2.50       0.00    1316 315 (sd-pam)

# プロセス名のみ抽出する
Get-Process | Format-Table ProcessName

# WS, Id, SI, ProcessName を取り出す
Get-Process | Format-Table WS, Id, ProcessName

# WS, Id, SI, ProcessName を取り出し、読み易い形式にする
Get-Process | Format-Table WS, Id, ProcessName -Auto

 

Format-Table_2.ps1
#!/usr/bin/env pwsh

# Get-Process コマンドの結果より、Format-Table を使って特定の項目を抽出する
#
# NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
# ------    -----      -----     ------      --  -- -----------
#      0     0.00       2.50       0.00     828 827 (sd-pam)
#      0     0.00       2.50       0.00    1316 315 (sd-pam)
#

#--------------------------------------------------
# Name のみ表示する
#--------------------------------------------------
$fields = "Name"
Get-Process | Format-Table $fields -Auto

#--------------------------------------------------
# WS のみ表示する
#--------------------------------------------------
$fields = "WS"
Get-Process | Format-Table $fields -Auto

# Name と WS を表示する
$fields = "Name","WS"
Get-Process | Format-Table $fields -Auto

 

Format-Table_3.ps1
#!/usr/bin/env pwsh

# Get-Process コマンドの結果より、Format-Table を使って特定の項目を抽出する
#
# NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
# ------    -----      -----     ------      --  -- -----------
#      0     0.00       2.50       0.00     828 827 (sd-pam)
#      0     0.00       2.50       0.00    1316 315 (sd-pam)
#

#--------------------------------------------------
# Name のみを右寄せで表示する
#--------------------------------------------------
# Process-Name
#   ------------
#       (sd-pam)
#       (sd-pam)
#       update-notifier
$fields = @{Label = "Process-Name"; Expression = {$_.Name}; Align = "Right"}
Get-Process | Format-Table $fields -Auto

 

Format-Table_4.ps1
#!/usr/bin/env pwsh

# Get-Process コマンドの結果より、Format-Table を使って特定の項目を抽出する
#
# NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
# ------    -----      -----     ------      --  -- -----------
#      0     0.00       2.50       0.00     828 827 (sd-pam)
#      0     0.00       2.50       0.00    1316 315 (sd-pam)
#

#--------------------------------------------------
# Name と WS (MB 表記) を表示する
#--------------------------------------------------
# Name            WS (MB)
# ----                 -------
# (sd-pam)          2.49609375
# (sd-pam)                 2.5
# accounts-daemon   6.94921875
$fields = "Name",@{Label = "WS (MB)"; Expression = {$_.WS / 1mb}; Align = "Right"}
Get-Process | Format-Table $fields -Auto

 
 

1.2

 

Get-Process.ps1
#!/usr/bin/pwsh-preview
# ps -e コマンド相当

Get-Process

 
 

1.3

 

下図は Microsoft.PowerShell_profile_2.ps1 を適用した場合の例である。

f:id:dnkrnka:20180714121114p:plain
 

Microsoft.PowerShell_profile_1.ps1
#!/usr/bin/pwsh-preview
#
# Prompt 関数はプロンプト表示の設定をする関数である。
#
# $env は Linux の env コマンド相当であり、$env:PWD は
# 環境変数 $PWD に相当する。
# 
# Ubuntu18.04 環境での $profile は下記ファイルなので、これを上書きすれば
# Prompt が変更される。
# /home/neko/.config/powershell/Microsoft.PowerShell_profile.ps1

function Prompt
{
  "PS [$env:PWD] >"
}

 

Microsoft.PowerShell_profile_2.ps1
#!/usr/bin/pwsh-preview
#
# Prompt 関数はプロンプト表示の設定をする関数である。
#
# $env は Linux の env コマンド相当であり、$env:PWD は
# 環境変数 $PWD に相当する。
# 
# Ubuntu18.04 環境での $profile は下記ファイルなので、これを上書きすれば
# Prompt が変更される。
# /home/neko/.config/powershell/Microsoft.PowerShell_profile.ps1

function Prompt
{
  $id = 1
  $historyItem = Get-History -Count 1
  if($historyItem)
  {
    $id = $historyItem.Id + 1
  }
  Write-Host -ForegroundColor Green "`n[$(Get-Location)]"
  Write-Host -ForegroundColor Yellow -NoNewLine "PS:$id >  "
  $host.UI.RawUI.WindowTitle = "$(Get-Location)"
  "`b"
}

 

profile_prompt.ps1
#!/usr/bin/pwsh-preview
# プロファイル = Bash の .bash_profile や、csh の .cshrc 相当のファイルに
# プロンプト表示設定をする。

# プロファイルのパスを確認する
echo $PROFILE
# => /home/neko/.config/powershell/Microsoft.PowerShell_profile.ps1

# 新規にプロファイルを作成する
New-Item -Type file -Force $profile

 
 

1.9

 
Get-Date で取得するデータの型については Get-Member でメンバが取得できる

 

Get-Date_1.ps1
#!/usr/bin/env pwsh

Get-Date                                #=> 2018年7月15日日曜日 0:44:57
Get-Date -UFormat "%Y-%m-%d"            #=> 2018-07-15 
Get-Date -UFormat "%Y-%m-%d-%H-%M-%S"   #=> 2018-07-15-004457

 

Get-Date_2.ps1
#!/usr/bin/env pwsh

$date = Get-Date
echo $date.ToString("yyyyMMdd-HHMMss")  #=> 20180715-004457

 
 

2.1

 

Where-Object_Get-ChildItem_1.ps1
#!/usr/bin/env pwsh
#
# カレントディレクトリにあるディレクトリのみを表示する 
Get-ChildItem | Where-Object { $_.PsIsContainer }

 

Where-Object_Get-Process_1.ps1
#!/usr/bin/env pwsh-preview

# ps コマンドで sshd を抽出する ps -ef | grep -w sshd 処理相当である。
# 結果は以下のようになる。
# ----------------------------------------------------------------
# NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
# ------    -----      -----     ------      --  -- -----------
#      0     0.00       5.41       0.01     775 775 sshd
# ----------------------------------------------------------------

Get-Process | Where-Object {$_.Name -like "sshd"}

 

Where-Object_Get-Process_2.ps1
#!/usr/bin/env pwsh

Get-Process | Where-Object {$_.WorkingSet -gt 100MB} | Sort-Object -Descending  WS<Paste>

 

Where-Object_Get-Process_3.ps1
#!/usr/bin/env pwsh

# プロセスがオープンしたハンドルの数が 100 を超えるプロセスを表示する
Get-Process | Where-Object { $_.Handles -gt 100 }

# 結果は以下である
#
# NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
#  ------    -----      -----     ------      --  -- -----------
#       0     0.00     167.13      11.29    1824 824 chrome
#       0     0.00     105.51       3.36    4938 973 pwsh
#       0     0.00      84.12       1.35    5584 551 pwsh

 
 

2.2

 
Compare-Property.ps1 という Where-Object による比較処理を簡略化するためのスクリプトを用意する。
 

Compare-Property.ps1
#!/usr/bin/env pwsh

# 第1引数を property  に格納する
# 第2引数を operator  に格納する
# 第3引数を matchText に格納する
param($property, $operator = "eq", $matchText = "$true")

Begin
{
  # パイプラインオブジェクトが $_ に入る。
  # ` (バッククオート)はエスケープシーケンスであり、ShellScript での \ と読み替えれば良い。
  # ここでは次のように展開される。
  # $expression = $_.Handles -gt "100" 
  $expression = "`$_.$property -$operator `"$matchText`"" 
}

Process
{
  # Invoke-Expression を使ってスクリプトを実行する。
  # ここでは、Invoke-Expression $_.Handles -gt "100" となる
  if(Invoke-Expression $expression)
  {
    $_
  }
}

 

Test_Get-ChildItem.ps1
#!/usr/bin/env pwsh

# カレントパスに存在するディレクトリのみを表示する
Get-ChildItem | ./Compare-Property PsIsContainer

 

Test_Get-Process.ps1
#!/usr/bin/env pwsh

Get-Process | ./Compare-Property Handles gt 100

 
 

2.4

 

Foreach-Object_seq.ps1
#!/usr/bin/env pwsh

# 1 〜 10 までの値を 2倍して表示する
1..10 | Foreach-Object { $_ * 2 }

 
 

3.1

 

Get-Process_count.ps1
#!/usr/bin/env pwsh

# 出力を変数に格納して使用する
$processes = Get-Process

# プロセス数
echo $processes.Count

# プロセスID = 1 のプロセス情報を表示する
#
#  NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
# ------    -----      -----     ------      --  -- -----------
#      0     0.00       8.97       1.97       1   1 systemd
echo $processes | Where-Object { $_.ID -eq 1 }

 
 

3.2

 
環境変数へのアクセス方法には次の2つがある。

  • $env:XXXX
  • Get-ChildItem env:XXXX
> Get-ChildItem env:SHELL

Name                           Value
----                           -----
SHELL                          /bin/bash

 

> echo $env:SHELL
/bin/bash


環境変数全てを表示するためには次のように実行する。

Get-ChildItem env:

 
 

3.4

 

System.Diagnostics.Process=GetProcessById.ps1
#!/usr/bin/env pwsh

# オブジェクトを取得する
$proc = Get-Process xrdp-sesman

# プロセスIDを取得する
$xrdpId = $proc.Id

# staticメソッドを使ってプロセスIDからプロセス名を取得する
[System.Diagnostics.Process]::GetProcessById($xrdpId)

 

System.Environment=CurrentDirectory.ps1
#!/usr/bin/env pwsh

# PowerShell のスタートアップディレクトリを表示する
[System.Environment]::CurrentDirectory

# 該当プロセスにおけるカレントパスを取得する
(Get-Location).Path


# /tmp に移動する
echo "********* Set-Location /tmp *********"
Set-Location /tmp


# PowerShell のスタートアップディレクトリを表示する
[System.Environment]::CurrentDirectory

# 該当プロセスにおけるカレントパスを取得する
(Get-Location).Path

 
 

4.1

 

  • match
    • 引数として正規表現のパターンを取る。
    • 部分一致でも真となる
  • like
    • 引数として正規表現のパターンを取る。
    • 部分一致では偽となる

 

like_1.ps1
#!/usr/bin/env pwsh
#
# 真となるパターン
#
$data = "Hello World"
if ( $data -like "*ello*" )
{
  echo "like"
}
else
{
  echo "not like"
}

 

like_2.ps1
#!/usr/bin/env pwsh
#
# 偽となるパターン
#
$data = "Hello World"
if ( $data -like "*ello" )
{
  echo "like"
}
else
{
  echo "not like"
}

 

like_3.ps1
#!/usr/bin/env pwsh
#
# 偽となるパターン
#
$data = "Hello World"
if ( $data -like "ello" )
{
  echo "like"
}
else
{
  echo "not like"
}

 

like_4.ps1
#!/usr/bin/env pwsh
#
# 真となるパターン
# - パターンに一致して、かつ、文字列長が 10 以上の場合
$data = "Hello World"
if ( $data -like "*ello*" ) -and ( $data.Length -gt 10 )
{
  echo "like"
}
else
{
  echo "not like"
}

 

match_1.ps1
#!/usr/bin/env pwsh

$data = "Hello World"
if ( $data -match "Hello World" )
{
  echo "MATCH"
}
else
{
  echo "UnMATCH"
}

 

match_2.ps1
#!/usr/bin/env pwsh

$data = "Hello World"
if ( $data -match "ello" )
{
  echo "MATCH"
}
else
{
  echo "UnMATCH"
}

 
 

4.2

 

elseif.ps1
#!/usr/bin/env pwsh
#
# elseif の使い方
#
$data = "Hello World"
if ( $data -like "*ello" )
{
  echo '$data -like "*ello"'
}
elseif ( $data -like "ello*" )
{
  echo '$data -like "ello*"'
}
elseif ( $data -match "ello*" )
{
  echo '$data -match "ello*"'
}
else
{
  echo 'not found'
}

 
 

4.3

 

switch.ps1
#!/usr/bin/env pwsh
#
# 4.2 の elseif.ps1 を switch 文で書き直した場合
#
$data = "Hello World"
switch($data)
{
    { $data -like "*ello" } { echo '$data -like "*ello"' ; break }
    { $data -like "ello*" } { echo '$data -like "ello*"' ; break }
    { $data -match "ello*"} { echo '$data -match "ello*"'; break }
    default                 { echo 'not found' }
}

 
 

5.2

 

heredocument.ps1
#!/usr/bin/env pwsh

$myString = @"
This is the first line
of a very long string. A "here string"
lets you to create blocks of text
that span several lines.
"@

echo $myString

 

null.ps1
#!/usr/bin/env pwsh

# 複数行を一気にコメントアウトする

$null = @"
function MyTest
{
  "This should not be considered a function"
}

$myVariable = 10;
"@

# 以下は通常のスクリプト

 
 

5.4

 

dynamic_string_1.ps1
#!/usr/bin/env pwsh

$header = "Report for Today"
$myString = "$header`n----------------"
echo $myString

 

dynamic_string_2.ps1
#!/usr/bin/env pwsh

$header = "Report for Today"
$myString = "$header`n$('-' * $header.length)"
echo $myString

 
 

5.7

 

Contains.ps1
#!/usr/bin/env pwsh

$message = "Hello World"

# line --- パターンマッチしているか?
$message -like  "*llo W*"

# match --- パターンマッチしているか?
$message -match '.*l[l-z]o W.*$'

# Contains --- 文字を含んでいるか?
$message.Contains("World")

 
 

5.8

 

Replace_1.ps1
#!/usr/bin/env pwsh

$message = "Hello World"

# 単に、「$message.Replace("World", "PowerShell")」であれば、
# Hello PowerShell という内容がエコーバックされる。
$message = $message.Replace("World", "PowerShell")

echo $message

 

Replace_2.ps1
#!/usr/bin/env pwsh

$message = "Hello World"

$res = $message -replace '(.*) (.*)','$2 $1'

echo $res

 
 

7.1

 

Get-Content_1.ps1
#!/usr/bin/env pwsh
#
# cat $HOME/.bashrc
# と同じことをする

Get-Content $HOME/.bashrc

 

Get-Content_head_2.ps1
#!/usr/bin/env pwsh
#
# head -n 3 $HOME/.bashrc
# と同じことをする

Get-Content $HOME/.bashrc -head 3

 

Get-Content_line3-10_4.ps1
#!/usr/bin/env pwsh
#
# $HOME/.bashrc の 3〜10行目を表示する

(Get-Content $HOME/.bashrc)[2..9]

 

Get-Content_tail_3.ps1
#!/usr/bin/env pwsh
#
# tail -n 3 $HOME/.bashrc
# と同じことをする

Get-Content $HOME/.bashrc -tail 3

 

System.IO.File=ReadAllText.ps1
#!/usr/bin/env pwsh
#
# cat $HOME/.bashrc
# と同じことをする

$content = [System.IO.File]::ReadAllText("$HOME/.bashrc")

echo $content

 
 

7.2

 

Select-String_Filter.ps1
#!/usr/bin/env pwsh
#
# grep --include="*.ps1" -r '/env' 
# と同じ処理を実行するには、Get-Child と組み合せる

Get-ChildItem -Filter '*.ps1' -Recurse | Select-String '/bin/'

 

Select-String_Simple.ps1
#!/usr/bin/env pwsh
#
# grep -H -n -i '/bin/' $HOME/.bashrc
# と同じことをする

Select-String -Simple '/bin/' $HOME/.bashrc

 

Select-String_regex.ps1
#!/usr/bin/env pwsh
#
# 行頭が「#」で, 直後に半角スペースが出現し、その後に文字が見付かるパターンの検索

Select-String '^#\s.*' ~/.bashrc

 
 

7.5

 

System.IO.Path=GetTempFileName.ps1
#!/usr/bin/env pwsh

$filename = [System.IO.Path]::GetTempFileName()

Get-ChildItem $filename

Remove-Item $filename

 
 

8.1

 
get-content-xml.ps1 と sample.xml
タグ名と属性を使ってデータにアクセスする場合。
なお、タグ名のみで一意性が確保できれば、データへのアクセスのために属性を指定するような複雑なことはしなくて済む。
 

get-contet-xml.ps1
#!/usr/bin/env pwsh

# 次のように出力する
# ----------------------
# Lee  555-1212  home
# Ariel  555-1234  work
# ----------------------

$xml = [xml] (Get-Content 'sample.xml')

for ($i = 0; $i -lt $xml.AddressBook.Person.Length; $i++ )
{
  [Console]::Out.Write($xml.AddressBook.Person[$i].Name)
  [Console]::Out.Write("  ")  # Tab space
  [Console]::Out.Write($xml.AddressBook.Person[$i].Phone."#text") # 改行しない
  [Console]::Out.Write("  ")  # Tab space
  Write-Output $xml.AddressBook.Person[$i].Phone.type # 改行する
}

 

sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<AddressBook>
  <Person contactType="Private">
    <Name>Lee</Name>
    <Phone type="home">555-1212</Phone>
  </Person>
  <Person contactType="Business">
    <Name>Ariel</Name>
    <Phone type="work">555-1234</Phone>
  </Person>
</AddressBook>

 
 

8.3

 

sample.xml
<feff><?xml version="1.0" encoding="UTF-8"?>
<AddressBook>
  <Person contactType="Private">
    <Name>Lee</Name>
    <Phone type="home">0120-555-1212</Phone>
  </Person>
  <Person contactType="Business">
    <Name>Ariel</Name>
    <Phone type="work">0120-555-1234</Phone>
  </Person>
</AddressBook>||<
 
*** save-content-xml.ps1
>|ps1|
#!/usr/bin/env pwsh

$filename = (Get-Item sample.xml).FullName
$xml = [xml] (Get-Content $filename)

# sample.xml の変更前
for ($i = 0; $i -lt $xml.AddressBook.Person.Length; $i++ )
{
  [Console]::Out.Write($xml.AddressBook.Person[$i].Name)
  [Console]::Out.Write("  ")  # Tab space

  # 電話番号に 0120 を付与する
  $old = $xml.AddressBook.Person[$i].Phone."#text"
  $xml.AddressBook.Person[$i].Phone."#text" = "0120-" + $old
  Write-Output($xml.AddressBook.Person[$i].Phone."#text")
}

# sample.xml を更新して保存する
$xml.Save($filename)

 
 

9.1

 

System.Net.WebClient.ps1
#!/usr/bin/env pwsh

$source = "http://www.leeholmes.com/favicon.ico"
$destination = "/tmp/favicon.ico"
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($source, $destination)

Get-ChildItem $destination

 

System.Net.WebClient_By_IE.ps1
#!/usr/bin/env pwsh
#
# Internet Explorer によるアクセスと識別させる
#

$userAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2;)"

$wc = New-Object System.Net.WebClient
$wc.Headers.Add("user-agent", $userAgent)

 
 

11.1

 
動的配列を作る場合は、New-Object System.Collections.ArrayList を使う。
 

New-Object_ArrayList_1.ps1
#!/usr/bin/env pwsh 

$myArray = New-Object System.Collections.ArrayList
[void] $myArray.Add(1)
[void] $myArray.Add(2)
[void] $myArray.Add("Hello World")

$i = 0
foreach ( $element in $myArray ) 
{
  Write-Host `$myArray[$i] $myArray[$i]
  $i++
}

 

New-Object_ArrayList_2.ps1
#!/usr/bin/env pwsh 

# AddRange を使って複数個を一度に登録する。
$myArray = New-Object System.Collections.ArrayList
[void] $myArray.Add(1)
[void] $myArray.AddRange((2, "Hello World"))

$i = 0
foreach ( $element in $myArray ) 
{
  Write-Host `$myArray[$i] $myArray[$i]
  $i++
}

 

New-Object_ArrayList_3.ps1
#!/usr/bin/env pwsh 

# AddRange を使って複数個を一度に登録する。
$myArray = New-Object System.Collections.ArrayList
[void] $myArray.Add(1)
[void] $myArray.AddRange((2, "Hello World"))

# [1]の要素を削除する
$myArray.RemoveAt(1)

$i = 0
foreach ( $element in $myArray ) 
{
  Write-Host `$myArray[$i] $myArray[$i]
  $i++
}

 

array_1.ps1
#!/usr/bin/env pwsh

# 配列の使用例(1)
# 配列の全要素へのアクセス方法として foreach を使う
$myArray = 1,2,"Hello World"
$i = 0

foreach ($element in $myArray)
{
  Write-Host `$myArray[$i] $element
  $i++
}

 

array_2.ps1
#!/usr/bin/env pwsh

# 配列の使用例(2)
# 配列の全要素へのアクセス方法として for を使う
$myArray = 1,2,"Hello World"

for ($i = 0; $i -lt $myArray.Length; $i++ )
{
  Write-Host `$myArray[$i] $myArray[$i]
}

 

array_3.ps1
#!/usr/bin/env pwsh

# 配列の使用例(3)
# - 配列の全要素へのアクセス方法として foreach を使う
# - 配列の定義方法として @ を使う
$myArray = @(1,2,"Hello World")
$i = 0

foreach ($element in $myArray)
{
  Write-Host `$myArray[$i] $element
  $i++
}

 
 

11.12

 
ハッシュテーブル(連想配列)
@{ キー1 : 値1 ; キー2 : 値2 } という書式である。
 

hash.ps1
#!/usr/bin/env pwsh

# ハッシュテーブル(連想配列)の使用例

$myHashtable = @{}

$myHashtable = @{ key1 = "Value1" ; "key 2" = 1,2,3 }
$myHashtable["New Item"] = 5

echo $myHashtable

# => 結果は以下である
#
# Name                           Value
# ----                           -----
# New Item                       5
# key 2                          {1, 2, 3}
# key1                           Value1

 

hash_1.ps1
#!/usr/bin/env pwsh

# ハッシュテーブル(連想配列)の使用例

$myHashtable = @{}

$myHashtable = @{ key1 = "Value1" ; "key 2" = 1,2,3 }
$myHashtable["New Item"] = 5

echo $myHashtable

# => 結果は以下である
#
# Name                           Value
# ----                           -----
# New Item                       5
# key 2                          {1, 2, 3}
# key1                           Value1

 

hash_2.ps1
#!/usr/bin/env pwsh

# ハッシュテーブル(連想配列)の使用例

$myHashtable = @{}

$myHashtable = @{ key1 = "Value1" ; "key 2" = 1,2,3 }
$myHashtable["New Item"] = 5

foreach ($item in $myHashtable.GetEnumerator())
{
  echo $item
}

# => 結果は以下である(登録順は保持されない)
#
# Name                           Value
# ----                           -----
# key 2                          {1, 2, 3}
# New Item                       5
# key1                           Value1

 
 

11.13

 

hash_sort.ps1
#!/usr/bin/env pwsh

# ハッシュテーブル(連想配列)の使用例
# キーでソートする

$myHashtable = @{}

$myHashtable = @{ key1 = "Value1" ; "key 2" = 1,2,3 }
$myHashtable["New Item"] = 5

# キー・ソートを▽行い、値を表示する
foreach ($item in $myHashtable.GetEnumerator() | Sort-Object Name )
{
  echo $item.Value
}

echo "-------------------------------------------------"

# キー・逆順ソートを▽行い、値を表示する
foreach ($item in $myHashtable.GetEnumerator() | Sort-Object -Descend Name )
{
  echo $item.Value
}

echo "-------------------------------------------------"

# 値・ソートを行い、キーを表示する
foreach ($item in $myHashtable.GetEnumerator() | Sort-Object Value )
{
  echo $item.Name
}

 
 

11.7

 

array_contains.ps1
#!/usr/bin/env pwsh 
#
# 配列に数字の 1 を含むかどうかを判定する

# AddRange を使って複数個を一度に登録する。
$myArray = New-Object System.Collections.ArrayList
[void] $myArray.Add(1)
[void] $myArray.AddRange((2, "Hello World"))

if($myArray -contains 1 -eq $True)
{
  Write-Host '$myArray has 1'
}
else
{
  Write-Host '$myArray does not have 1'
}

# [0]の要素を削除する
$myArray.RemoveAt(0)

if($myArray -contains 1 -eq $True)
{
  Write-Host '$myArray has 1'
}
else
{
  Write-Host '$myArray does not have 1'
}

 
 

11.8

 

array_eq.ps1
#!/usr/bin/env pwsh 
#
# 配列の要素と完全一致かを判定する (-eq)

# AddRange を使って複数個を一度に登録する。
$myArray = New-Object System.Collections.ArrayList
[void] $myArray.Add(1)
[void] $myArray.AddRange((2, "Hello World", 10, 123, 1234, 20000, 99999, 'PowerShell is beautiful'))


echo "---------------------------"
echo ($myArray -eq "*1*")               #=>
echo "---------------------------"
echo ($myArray -eq "1.")                #=> 1
echo "---------------------------"
echo ($myArray -eq ".")                 #=>
echo "---------------------------"
echo ($myArray -eq "* *")               #=>
echo "---------------------------"
echo ($myArray -eq "1*")                #=>
echo "---------------------------"
echo ($myArray -eq "10")                #=> 10
echo "---------------------------"
echo ($myArray -eq "1..")               #=>
echo "---------------------------"
echo ($myArray -eq "Hello")             #=>
echo "---------------------------"
echo ($myArray -eq "Hello World")       #=> Hello World
echo "---------------------------"
echo ($myArray -eq "PowerShell")                #=>
echo "---------------------------"
echo ($myArray -eq "PowerShell is beautiful")   #=> PowerShell is beautiful
echo "---------------------------"

 

array_like.ps1
#!/usr/bin/env pwsh 
#
# 配列の要素とパターンが一致するかを判定する (like)

# AddRange を使って複数個を一度に登録する。
$myArray = New-Object System.Collections.ArrayList
[void] $myArray.Add(1)
[void] $myArray.AddRange((2, "Hello World", 10, 123, 1234, 20000, 99999, 'PowerShell is beautiful'))


echo "---------------------------"
echo ($myArray -like "*1*")       #=>1, 10, 123, 1234
echo "---------------------------"
echo ($myArray -like "1.")        #=>
echo "---------------------------"
echo ($myArray -like ".")         #=>
echo "---------------------------"
echo ($myArray -like "* *")         #=> Hello World PowerShell is beautiful
echo "---------------------------"

 

array_match.ps1
#!/usr/bin/env pwsh 
#
# 配列に完全一致するパターンを含むかどうかを判定する (match)

# AddRange を使って複数個を一度に登録する。
$myArray = New-Object System.Collections.ArrayList
[void] $myArray.Add(1)
[void] $myArray.AddRange((2, "Hello World", 10, 123, 1234, 20000, 99999, 'PowerShell is beautiful'))


Write-Host ($myArray -match 1)      #=>1, 10, 123, 1234
Write-Host ($myArray -match 10)     #=>10
Write-Host ($myArray -match 1.)     #=>1, 10, 123, 1234
Write-Host ($myArray -match "1.")   #=>10, 123, 1234
Write-Host ($myArray -match "1.$")  #=>10

Write-Host ($myArray -match "1*$")  #=>1 2 Hello World 10 123 1234 20000 99999 PowerShell is beautiful
Write-Host ($myArray -match ".")    #=>1 2 Hello World 10 123 1234 20000 99999 PowerShell is beautiful

 
 

12.1

 

Read-Host.ps1
#!/usr/bin/env pwsh

$directory = Read-Host "Enter a directory name"

echo $directory

 
 

12.2

 

Console=ReadKey_anychar.ps1
#!/usr/bin/env pwsh

# 1文字だけ読み取る
# [Console]::ReadKey は Console クラスの静的メソッド ReadKey を呼び出すというものである。
$key = [Console]::ReadKey($true)
echo $key

# 結果は以下の通り
#
# KeyChar Key Modifiers
# ------- --- ---------
#       a   A         0

 

Console=ReadKey_pause.ps1
#!/usr/bin/env pwsh

# pause のエミュレート

function Pause
{
  Write-Host -NoNewLine "Press any key to continue.."
  [Console]::ReadKey($true) | Out-Null
  Write-Host
}

Pause

 
 

14.1

 
一時的にカレントディクトリを PATH に追加するには次のように実行する

$env:PATH = $env:PATH + ';.'

 
 

14.5

 

myInvocation.ScriptName.ps1
#!/usr/bin/env pwsh

$script_fullpath = $myInvocation.InvocationName

echo $script_fullpath

 
 

14.8

 

Get-location.ps1
#!/usr/bin/env pwsh

# PowerShell のスタートアップディレクトリを表示する
[System.Environment]::CurrentDirectory

# 該当プロセスにおけるカレントパスを取得する
(Get-Location).Path


# /tmp に移動する
echo "********* Set-Location /tmp *********"
Set-Location /tmp


# PowerShell のスタートアップディレクトリを表示する
[System.Environment]::CurrentDirectory

# 該当プロセスにおけるカレントパスを取得する
(Get-Location).Path

 
 

17.1

 

Get-ChildItem_find_ctime.ps1
#!/usr/bin/env pwsh

# 60日間以上更新がないファイルを洗い出す
# find . -type f -ctime +60  と同じことである。
$compareDate = (Get-Date).AddDays(-60)
Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -lt $compareDate }

# 60日間以内に更新されたファイルを洗い出す
# find . -type f -ctime -60  と同じことである。
$compareDate = (Get-Date).AddDays(-60)
Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -ge $compareDate }


 

Get-ChildItem_find_newrmt.ps1
#!/usr/bin/env pwsh
# 2018/07/16 以降に更新されたディレクトリおよびファイルを洗い出す。
# find .. -type f -newermt "2018-07-16"  と同じことである。

Get-ChildItem -Recurse .. | Where-Object { $_.LastWriteTime -gt "07/16/2018" }

 
 

17.11

 

New-Item_Directory.ps1
#!/usr/bin/env pwsh

# aaabbb ディレクトリを作成する
New-Item -ItemType Directory aaabbb

 
 

17.12

 

Remove-Item.ps1
#!/usr/bin/env pwsh

# ShellScript の test -d aaabbb と同じこと
Test-Path aaabbb

# aaabbb ディレクトリを作成する
New-Item -ItemType Directory aaabbb
Test-Path aaabbb

Remove-Item aaabbb
Test-Path aaabbb

 
 

17.13

 
Rename-Item は同じフォルダ内でのリネームに限定される。
ディレクトリを変えたファイル名の変更には、Move-Item を使うこと。
 

Rename-Item-1.ps1
#!/usr/bin/env pwsh

# mv sample.txt sample.txt.bak と同じこと
Rename-Item sample.txt sample.txt.bak

 

Rename-Item-2.ps1
#!/usr/bin/env pwsh

# *.gif -> *.jpg へとリネームする。
#
# mv *.gif *.jpg と同じことだが、PowerShell ではこの表記ができない。
# -replace 演算子を使う必要がある。

Get-ChildItem *.gif | Rename-Item -NewName { $_.Name -replace '.gif$','.jpg' }

 

Rename-Item-3.ps1
#!/usr/bin/env pwsh

# ファイル名の _ を - に変換する
Get-ChildItem *_* | Rename-Item -NewName { $_.Name -replace '_','-' }

 
 

17.14

 

Move-Item-1.ps1
#!/usr/bin/env pwsh

# mv sample.txt sample.txt.bak と同じこと
Move-Item sample.txt sample.txt.bak

 
 

17.2

 

Clear-Content.ps1
#!/usr/bin/env pwsh

Get-ChildItem sample.txt

# ファイルの中身をクリア(0詰め)する
Clear-Content sample.txt

Get-ChildItem sample.txt

 
 

17.3

 

file_Attributes.ps1
#!/usr/bin/env pwsh

# 権限付与前
# ------       2018/07/16     20:35            418 sample.txt
# 
# 権限付与後
# --r---       2018/07/16     20:35            418 sample.txt

Get-Item sample.txt

# ファイルオブジェクトを取得する
$file = Get-Item sample.txt
# ReadOnly権限を付与する
$file.IsReadOnly = $true

Get-Item sample.txt

 
 

17.4

 
 

17.5

 

Get-ChildItem_find_d.ps1
#!/usr/bin/env pwsh

# 1.1 や 17.12 といった「数字.数字」パターンの名称を持つ
# - ディレクトリ
# を抽出する

param( [string]$target='.' )

Get-ChildItem -Recurse $target| `
Where-Object { (Test-Path -PathType Container $_ ) -eq $True } | `
Where-Object {$_.Name -match '[0-9]*\.[0-9]*' } 

 

Get-ChildItem_find_f.ps1
#!/usr/bin/env pwsh

# 1.1 や 17.12 といった「数字.数字.txt」パターンの名称を持つ
# - ファイル
# を抽出する

param( [string]$target='.' )

Get-ChildItem -Recurse $target| `
Where-Object { (Test-Path -PathType Container $_ ) -eq $False } | `
Where-Object {$_.Name -match '[0-9]*\.[0-9]*\.txt' } | `
Format-Table Name

 

Get-ChildItem_find_f_and_d.ps1
#!/usr/bin/env pwsh

# 1.1 や 17.12 といった「数字.数字」パターンの名称を持つ
# - ディレクトリ
# - ファイル
# を抽出する
Get-ChildItem -Recurse | `
Where-Object {$_.DirectoryName -match '[0-9]*\.[0-9]*' } 

 
 

17.8

 

Join-Path.ps1
#!/usr/bin/env pwsh

Join-Path /tmp /a /b /c #=> /tmp/a/b/c

 

Resolve-Path.ps1
#!/usr/bin/env pwsh

# カレントに a.txt がある場合に、フルパスを得る
(Resolve-Path $Args[0]).Path

 
 

17.9

 

Get-Content_wait.ps1
#!/usr/bin/env pwsh

param( [parameter(mandatory=$True)][String]$target )

if(-not (Test-Path $target))
{
  throw "Could not found $target"
}

Get-Content $target -Wait

 
 

19.1

 

Compare-Object.ps1
#!/usr/bin/env pwsh
#
# vim を起動した状態と削除後の状態を比較する.
# 結果は以下のようになる。
#
# InputObject                      SideIndicator
# -----------                      -------------
# System.Diagnostics.Process (vim) <=

$processes = Get-Process
Stop-Process -ProcessName vim

$newProcesses = Get-Process

Compare-Object $processes $newProcesses

 
 

19.2

 

Compare-Object_2.ps1
#!/usr/bin/env pwsh
#
# ファイルの差分を比較する。
# ファイルの内容は一旦変数に書き出す。

$prev = Get-Content ../19.1/Compare-Object.ps1
$cur  = Get-Content Compare-Object_2.ps1

Compare-Object $prev $cur

 
 

19.3

 

Compare-Object_3.ps1
#!/usr/bin/env pwsh
#
# [1] ファイルのハッシュ値を求める -> $out_hash へハッシュ値を格納する
# [2] 上記 [1] で出力したハシュ値を読み込んで $in_hash に格納するl
# [3] 上記 [1] と [2] の結果を比較する

$out_hash = Get-FileHash $HOME/.bashrc
echo $out_hash | Export-CliXml /tmp/sample_export_clixml.xml

$in_hash = Import-CliXml /tmp/sample_export_clixml.xml

Compare-Object $out_hash $in_hash -Property Path,HashValue