PowerShellを使い始めるときの取っ掛かり

# PowerShellを実業務で使い始めるときの取っ掛かりになる情報

## $profile

- Powershellのターミナル起動時に自動で$profileから定義情報（エイリアス定義や関数定義）が読み込まれる。
  要するにLinuxの.bashrcや.bash_profileと同じようなもの。

- $profileの実体は`$HOME\Documents\PowerShell\Profile.ps1`に保存される。
  詳しくは[公式ページ](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.3)。


```powershell:$profileの編集
# 最初は$HOME\Documents配下にPowerShellディレクトリがないので自分で作る。
New-Item $HOME\Documents\PowerShell -ItemType Directory
# notepadで開く（最初はファイルがないので新規ファイル扱い）
notepad $profile

# 編集後にファイル名「Profile.ps1」で保存する。
```

## $profileに関数を登録しておく

```powershell:関数登録の例
# Get-Content = catコマンド
Get-Content $profile
 function ls_filename_only() {
   foreach($item in Get-Item ./*) {
     # Basename = 拡張子抜きの名前
     $item.Basename
   }
 }
```

```powershell:関数実行の例
# 登録した関数を実行（拡張子抜きの名前だけを表示）
ls_filename_only
 alternatives
 alternatives.log
 alternatives.log.2
 auth
 auth.log
 auth.log.2


# 実際のファイル
Get-Item ./*
 -rw-r--r-- root             root               2022/12/05 00:00              0 alternatives.log
 -rw-r--r-- root             root               2022/12/04 16:45            753 alternatives.log.1
 -rw-r--r-- root             root               2022/10/26 23:55           4464 alternatives.log.2.gz
 -rw-r----- root             adm                2022/12/11 15:39           7863 auth.log
 -rw-r----- root             adm                2022/12/10 23:30          69870 auth.log.1
 -rw-r----- root             adm                2022/12/03 23:58           3409 auth.log.2.gz

```


## $profileにエイリアスを登録して楽をする。

```powershell:エイリアス登録の例
Get-Content $profile  
 # Home配下のファイル一覧
 Set-Alias ls_alias Get-Item 
 
 # functionをエイリアスとして登録
 #（引数のせいでうまくエイリアスにできない場合は、functionで定義してエイリアスに登録する）
 function ls_file_name_only() {
                             # 引数の値はargsで受け取る
   foreach($item in Get-Item $args[0]) {
     $item.Basename
   }
 }
 Set-Alias ls_name ls_file_name_only

```

```powershell:エイリアス実行の例
ls_alias ./*
 -rw-r--r-- root             root               2022/12/05 00:00              0 alternatives.log
 -rw-r--r-- root             root               2022/12/04 16:45            753 alternatives.log.1
 -rw-r--r-- root             root               2022/10/26 23:55           4464 alternatives.log.2.gz
 -rw-r----- root             adm                2022/12/11 15:39           7863 auth.log
 -rw-r----- root             adm                2022/12/10 23:30          69870 auth.log.1
 -rw-r----- root             adm                2022/12/03 23:58           3409 auth.log.2.gz

ls_name ./*
 alternatives
 alternatives.log
 alternatives.log.2
 auth
 auth.log
 auth.log.2

```

## 作業用にスクリプトファイルをつくる

# よく使う命令・構文

## [ファイル・ディレクトリ一覧を取得](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-item?view=powershell-7.3)
```powershell
Get-Item ファイルパス
```

## [ファイルの内容を表示する](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7.3)
```powershell
Get-Content ファイルパス [-Encoding <ENcoding>] # Encoding以外のオプションもある
```

## headと同じ働きをする命令

```powershell:Get-Contentのオプション指定
# $profileの先頭６行
Get-Content $profile -head 6
```


```powershell:[始まり..終わり] で指定
# $profileの先頭６行
$(Get-Content $profile)[0..5]
```

## tailと同じ働きをする命令

```powershell:Get-Contentのオプション指定
# $profileの末尾６行
Get-Content $profile -tail 6
```

```powershell:[始まり..終わり] で指定
# $profileの末尾６行
$(Get-Content $profile)[-6..-1]

```

```powershell:tailコマンドのファイル監視と同等の挙動をさせる
# -waitオプションを使う
Get-Content $profile  -wait
```

## ループ処理
- ファイル１件ずつ処理する場合
- ファイル情報ののプロパティは [公式ページ](https://learn.microsoft.com/ja-jp/powershell/scripting/lang-spec/chapter-04?view=powershell-7.3#4518-file-description-type)参照。
```powershell
foreach($item in Get-Item ファイルパス) {
  $item.Name #ファイル名を使う
  $item.Basename # 拡張子抜きの名前を使う
}
```

## コマンド実行
```powershell
# PowerShellのコマンドを実行
Invoke-Command …

# 別プロセスを実行
Start-Process …
```

## 配列を利用した繰り返し処理
```powershell
# @()で配列を定義
$test_array = @('a', 'b', …)

foreach($item in $test_array) {
  Write-Host $item
}
```

## Mapを利用した繰り返し処理
```powershell
# @{}でMapを定義
$test_map = @{
  "key" = "value",
  …
}
foreach($entry in $test_map.GetEnumerator()) {
  Write-Host $entry.Key;
  Write-Host $entry.Value;
}

```

 
## Excelの読み書き（ActiveX）

```powershell
# Excel（ActiveX）を変数化
$excel = New-Object -ComObject Excel.Application
$book = $null
try{
  # 不可視にしておく
  $excel.Visible = $false
  $excel.DisplayAlerts = $false

  # Book Open
  $book = $excel.Workbooks.Open(ファイルパス)

  # シート取得
  $sheet = $book.Sheets(1)

  # セルへ値書き込み
  $sheet.Cells.Item(x, y) = 値

  # セル値の取得
  Write-Host $sheet.Cells.Item(x, y)
  Write-Host $sheet.Cells.Item(x, y).Text    # 文字列として取得
  Write-Host $sheet.Cells.Item(x, y).Value() #値を取得

  # Excel Book 保存
  [void]$book.Save()

} finally {
  try{
    if($book -ne $null) {
      # 利用したExcel Bookオブジェクトの開放
      [void]$book.Close($false)
      [System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
    }

    # Excelオブジェクトの開放
    [void]$excel.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
  }catch{
  }
 
}
```

## CSVファイルの読み書き
```powershell
# CSV文字列をCSVオブジェクトに変換
$CSVオブジェクト = CSV文字列 | ConvertFrom-Csv
# CSVオブジェクトをCSV文字列に変換
$CSV文字列 = CSVオブジェクト | ConvertTo-Csv

# オブジェクトを一連のコンマ区切り値 (CSV) 文字列に変換し、文字列をファイルに保存
CSVオブジェクト | Export-Csv -Path 保存先ファイルパス
#コンマ区切り値 (CSV) ファイル内の項目からテーブルのようなカスタム オブジェクトを作成
$CSVオブジェクト変数 = Import-Csv -Path CSVファイルパス
```

## jsonファイルの読み書き 
```powershell
# JSON文字列をJSONオブジェクトに変換（PSObject または Hashtableオブジェクト）
$JSONオブジェクト = JSON文字列 | ConvertFrom-Json
# JSONオブジェクトをJSON文字列に変換
$JSON文字列 = JSONオブジェクト | ConvertTo-Json
```

## xmlの読み書き
```powershell
# .NETオブジェクトをXML表現に変換
$XML = $PSObject | ConvertTo-XML
```

# PowerShellのリファレンス
- https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/?view=powershell-7.3