PowerShellメモ　基本

# <i class="fa fa-cubes" style="font-size:1em;"></i> メモ

## <i class="fa fa-cube" style="font-size:1em;"></i> PowerShellのバージョン情報を表示

```PowerShell
$PSVersionTable
```

```Text:実行結果の例
Name                           Value
----                           -----
PSVersion                      5.1.14393.693
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14393.693
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

## <i class="fa fa-cube" style="font-size:1em;"></i> 補完
コマンドやパス等は途中まで入力して`TAB`を押せば補完してくれる。

## <i class="fa fa-cube" style="font-size:1em;"></i> コマンドのヘルプ
書式
`コマンド名 -?`
`man コマンド名 -Full`

```PowerShell:例
ls -?
```

## <i class="fa fa-cube" style="font-size:1em;"></i> ヘルプの更新
PowerShellを「管理者として実行」で起動し、以下のコマンドを入力

```PowerShell
Update-Help -Force -UICulture en-US
Update-Help -Force -UICulture ja-JP
```

## <i class="fa fa-cube" style="font-size:1em;"></i> スクリプトファイルの実行ポリシー確認・設定

```PowerShell
# 現在の実行ポリシー確認
Get-ExecutionPolicy
# 実行ポリシーを「ローカル保存のスクリプト実行可」に設定する場合
Set-ExecutionPolicy RemoteSigned
```

## <i class="fa fa-cube" style="font-size:1em;"></i> 制御構文

```PowerShell
if ($x -eq "a")
{
    Write-Host "aaa"
}
elseif ($x -eq "b")
{
    Write-Host "bbb"
}
else
{
    Write-Host "ccc"
}
```

```PowerShell
switch ($x)
{
    "a" { Write-Host "aaa"; break }
    "b" { Write-Host "bbb"; break }
    default { Write-Host "ccc" }
}
```

```PowerShell
$i = 0
$cnt = 5
while ($i -lt $cnt)
{
    Write-Host $i
    $i++
}

for ($i = 0; $i -lt $cnt; $i++)
{
    Write-Host $i
}
```

## <i class="fa fa-cube" style="font-size:1em;"></i> BATファイルからPowerShellを起動してスクリプト実行

```Bat:例1(Test1.bat)
@ECHO OFF
REM ------------------------------------------
REM スクリプト実行　※予め実行ポリシーでスクリプトを実行できるようにしておくこと
REM ------------------------------------------

REM スクリプト実行
PowerShell.exe C:\Work\Script\Test_A.ps1
REM キー入力待ち
PAUSE
```

```Bat:例2(Test2.bat)
@ECHO OFF
REM ------------------------------------------
REM 実行ポリシーを一時的に変更してスクリプト実行
REM ------------------------------------------

REM スクリプト実行(相対パス指定)
PowerShell.exe -ExecutionPolicy RemoteSigned .\Test_B.ps1
REM キー入力待ち
PAUSE
```

```Bat:例3(Test3.bat)
@ECHO OFF
REM ------------------------------------------
REM PowerShellスクリプト側の終了コードを受け取る
REM ------------------------------------------

REM スクリプト実行
PowerShell.exe -Command ".\Test_C.ps1 'ok';EXIT $LASTEXITCODE"
REM 0が表示される
ECHO %ERRORLEVEL%

REM スクリプト実行
PowerShell.exe -Command ".\Test_C.ps1 'ng';EXIT $LASTEXITCODE"
REM 5が表示される
ECHO %ERRORLEVEL%
REM キー入力待ち
PAUSE
```

```PowerShell:Test_C.ps1
Param([string]$flg)

# 引数チェック
if ($flg -eq "ok")
{
    exit 0
}
else
{
    exit 5
}
```

## <i class="fa fa-cube" style="font-size:1em;"></i> コマンド一覧を確認

```PowerShell
Get-Command | Out-GridView
```

```PowerShell:もっと短く
gcm | ogv
```

## <i class="fa fa-cube" style="font-size:1em;"></i> エイリアス一覧を確認

```PowerShell
Get-Alias | Out-GridView
```

```PowerShell:もっと短く
alias | ogv
```

![p02.png](https://qiita-image-store.s3.amazonaws.com/0/142879/2df49436-0563-629e-2419-34d549662f85.png)


## <i class="fa fa-cube" style="font-size:1em;"></i> 関数一覧を確認
```PowerShell
Get-ChildItem Function:
```

```PowerShell:もっと短く
ls function:
```

関数の定義も表示する場合。

```PowerShell
# 関数一覧と定義内容(の先頭部分)を表示
ls function: | select name,definition

# mkdir関数の定義内容を表示
(ls function:\mkdir).definition
```

## <i class="fa fa-cube" style="font-size:1em;"></i> 環境変数

```PowerShell
# 環境変数一覧を表示
Get-ChildItem Env:
```

```PowerShell:もっと短く
# 環境変数一覧を表示
ls env:
```

```PowerShell
# 環境変数を個別に参照
$env:appdata

$env:temp
```

## <i class="fa fa-cube" style="font-size:1em;"></i> データ型の確認

```PowerShell
$obj1.GetType()
```

## <i class="fa fa-cube" style="font-size:1em;"></i> 配列

```PowerShell
$a = @(11,22,33)
$a[0]  # 11

$b = 4,5,6
$b[0]  # 4

$c = ,7,8,9
$c[0]  # 7

$d = 10..12
$d[0]  # 10
$d[1]  # 11
$d[2]  # 12
```

## <i class="fa fa-cube" style="font-size:1em;"></i> 連想配列(ハッシュ)

```PowerShell
$h = @{"い"=10; "ろ"=20; "は"=30}

$h["い"]  # 10
$h.い  # 10

$h.Contains("い")  # True
$h.Contains("に")  # False

$h.Keys  # い ろ は ※順序は不定
$h.Values # 10 20 30 ※順序は不定
```

## <i class="fa fa-cube" style="font-size:1em;"></i> プロファイル
PowerShell起動時に自動的に実行されるスクリプト。
関数やエイリアスなどを登録しておく。
ファイルパスは以下で確認できる。

```PowerShell
$PROFILE
```

初期状態ではこのファイルは存在しないので自分で作成し、起動時に実行したいコマンドを書いておく。

```PowerShell
New-Item (Split-Path $PROFILE -Parent) -ItemType Directory -Force;Notepad.exe $PROFILE
```

で空ファイルを作成するのが楽。
※**PowerShell**と**PowerShell ISE**は参照するプロファイルは別なのでそれぞれの環境で上記コマンドを実行し、作成しておく。

## <i class="fa fa-cube" style="font-size:1em;"></i> 比較演算子 早見表
| 演算子 | 意味 |
|:-:|:-:|
|-eq|＝   |
|-ne   |≠   |
| -gt  | ＞  |
| -ge  | ≧  |
|  -lt | ＜  |
| -le  | ≦  |
|  -like |ワイルドカード   |
| -notlike  |ワイルドカード(否定)   |
| -match  |正規表現  |
| -notmatch  | 正規表現(否定)  |

大文字・小文字を区別する場合は頭にcを、区別しない場合はiを付ける。
例)-ceq
初期値は区別しない(i付きと同じ)。

## <i class="fa fa-cube" style="font-size:1em;"></i> VBのOption Explicit的なもの

```PowerShell
Set-StrictMode -Version Latest
```

## <i class="fa fa-cube" style="font-size:1em;"></i> 現在日時の文字列

```PowerShell
(Get-Date).ToString("yyyy/MM/dd HH:mm:ss.fff")
```

## <i class="fa fa-cube" style="font-size:1em;"></i> 簡易電卓
数式を入力してEnterで計算結果を表示。
![p01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/65c5a154-023e-3efa-bad1-bd0600619b8e.png)


# <i class="fa fa-cubes" style="font-size:1em;"></i> 動作確認した環境
* PowerShell V4
* PowerShell V5

# <i class="fa fa-book" style="font-size:1em;"></i> 参考サイト
* [PowerShell リファレンス - MSDN](https://msdn.microsoft.com/powershell/reference/readme)