PowerShell で Shell Script と同じシェルを実装してみる その２

私は Bash派だが、Windows で開発するときに PowerShell を使わないといけないケースがある。Bashでできることをしたいだけなので、Tipsを中心に書いていく。

* [PowerShell で Shell Script と同じシェルを実装してみる](https://qiita.com/TsuyoshiUshio@github/items/dcf2e190a730e74e30b3)

も参考にになると思うが、上記に乗っていない Tips を書いていきたい。

# Exit コードの参照

```powershell
param ($name)

if ($name -eq $null) {
    write-host "-name can not be null."
    exit 1
}
write-host $name
```

`LastExitCode` or `$?` が動作する

```powershell
PS > .\publish.ps1
-name can not be null. 
PS > echo $?
False
PS > .\publish.ps1
-name can not be null. 
PS > $LastExitCode
1
```

# Zip ファイルを作成する

この Zip 作成には 2 つの条件が必要。まず、アーカイブにディレクトリを含まないこと。サブディレクトリは含むこと。`Force` のフラグは必要でこれがないと、zip を上書きしてくれない。

```powershell
Compress-Archive -Path '.\target\azure-functions\sample\*' -DestinationPath .\sample.zip -Force
```

しっかり想定どおり

```
PS > Expand-Archive -Path .\sample.zip -DestinationPath . 

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/13/2020  11:09 PM                Functions01
d-----         8/13/2020  11:09 PM                Functions02
d-----         8/13/2020  11:09 PM                lib
-a----         8/13/2020  10:59 PM           5817 fabrikam-functions-1.0-SNAPSHOT.jar
-a----         8/13/2020  10:59 PM            142 host.json
-a----         8/13/2020  10:59 PM            123 local.settings.json
-a----         8/13/2020  11:08 PM        1350319 sample.zip


PS C:\Users\tsushi\Code\java\azure-functions-samples\Logging\DistributedTracing\aaa>
```

## Unzip
ちなみに unzip は次の通り

```powershell
PS > Expand-Archive -Path .\azure-functions-java-worker-1.7.3-SNAPSHOT.jar -DestinationPath .
```


# Azure Functions の Zip をデプロイする

* [Zip deployment for Azure Functions](https://docs.microsoft.com/en-us/azure/azure-functions/deployment-zip-push)

でよさげだが、自分のPCだと下記のことが必要だった。

* PowerShell の Version UP -> 7.0.3 (Az Command をインストールするのに必要) - [Install Azure PowerShell](https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-4.5.0)  6.2.4 以上必要らしい
* IntelliJ に、`C:\Program Files\PowerShell\7\pwsh.exe` を Terminal のコマンドにするように変更。パスを通す必要があるようす。PowerShell7はインストールしても、Side-by-side で両方使える様子。

## Az Module install
* モジュールのインストール [Install the Azure PowerShell module](https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-4.5.0)

以前は`AzureRm` というモジュールだったので、混乱に注意。

_Az Module_ install

```powershell
if ($PSVersionTable.PSEdition -eq 'Desktop' -and (Get-Module -Name AzureRM -ListAvailable)) {
    Write-Warning -Message ('Az module not installed. Having both the AzureRM and ' +
      'Az modules installed at the same time is not supported.')
} else {
    Install-Module -Name Az -AllowClobber -Scope CurrentUser
}
```

## Login

```powershell
Connect-AzAccount
```

## Current Context

```powershell
Get-AzContext
```

## List Context

下記のコマンドは自分のSubscriptionしか表示されないようす。Contributorになっている他人のサブスクリプションはでてこなそう。

```powershell
Get-AzContext -ListAvailable
```

これを使う

```powershell
Get-AzSubscription
```

## Set-Context

`az account set` 相当

```powershell
Set-AzContext -SubscriptionId <YOUR_SUBSCRIPTION> 
Get-AzContext
```

## deploy

Force は必要。それがないと、本当にデプロイしていいか聞いてくるので。

```powershell
Publish-AzWebApp -ResourceGroupName $resourceGroup -Name $appName -ArchivePath .\sample.zip -Force
```