PowerShell コマンドメモ

## レジストリキー登録

## Chef クライアントインストール

```
PS > Invoke-WebRequest https://opscode-omnibus-packages.s3.amazonaws.com/windows/2008r2/x86_64/chef-client-12.4.1-1.msi -OutFile:chef-client-12.4.1-1.msi
```

## 外付けディスクのマウント

サーバー作成直後の状態。

```
PS > Get-Disk

Number Friendly Name                            OperationalStatus     Total Size Partition Style
------ -------------                            -----------------     ---------- ---------------
0      VMware Virtual disk SCSI Disk Device     Online                     80 GB MBR
```

ニフティクラウドのコントロールパネルからディスクをアタッチすると、`Get-Disk` で認識されているディスクの数が増えていることが分かる。

```
PS > Get-Disk

Number Friendly Name                            OperationalStatus     Total Size Partition Style
------ -------------                            -----------------     ---------- ---------------
0      VMware Virtual disk SCSI Disk Device     Online                     80 GB MBR
1      VMware Virtual disk SCSI Disk Device     Offline                   100 GB RAW


```

参考:

* [Use PowerShell to Initialize Raw Disks and to Partition and Format Volumes - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs](http://blogs.technet.com/b/heyscriptingguy/archive/2013/05/29/use-powershell-to-initialize-raw-disks-and-partition-and-format-volumes.aspx)
  * 複数の RAW ディスクがある場合どうなるのか？
  * confirm false だけどなんか聞かれた
  * 実行後 E ドライブになったが Get-PSDrive しても見えなかった
    * Get-Volume してから Get-PSDrive したら見えるようになったっぽい
* [Disk - Set as Offline or Online](http://www.eightforums.com/tutorials/53106-disk-set-offline-online.html)
* [Set-Disk](https://technet.microsoft.com/ja-jp/library/Hh848649(v=WPS.630).aspx)
* [Windows Server にEBS Volumeを追加する ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/attach_ebs_volume_to_windows-server/)

## パスを通す

```
PS > $Env:Path += ";${Env:ProgramFiles}\vim74-kaoriya-win64\"
PS > vim
```

恒常的な設定とするには上記を `$Profile` に書く。

参考: [PowerShell/環境変数のパスにパスを追加する - TOBY SOFT wiki](http://tobysoft.net/wiki/index.php?PowerShell%2F%B4%C4%B6%AD%CA%D1%BF%F4%A4%CE%A5%D1%A5%B9%A4%CB%A5%D1%A5%B9%A4%F2%C4%C9%B2%C3%A4%B9%A4%EB)

## 環境変数に関する操作を行う

コマンドプロンプトとは異なり、`%TEMP%` のような形式では環境変数にアクセスできない。PS ドライブとしてアクセスする。

```
## 環境変数表示
PS > $env:temp
```

## ファイルを編集する

* `notepad`
* `Set-Content`
*  vim インストール




## PowerShell スクリプトをファイルに書き実行する

```
PS > notepad test.ps1 # Write-Host 'Hello World' と書き込む
PS > ./test.ps1
Hello World
```

## 対話せずにすべてデフォルト値を入力させる (-y みたいなやつ)

`-Force` オプションを使えばよいらしい。デフォルト値以外を入力させる方法は不明。

```
PS > Enable-PSRemoting -Force
```

参考: [scripting - Automatic confirmation of deletion in powershell - Stack Overflow](http://stackoverflow.com/questions/4753702/automatic-confirmation-of-deletion-in-powershell)

## プロフィール (.bash_profile のようなもの) を作成する

プロフィール用ファイルのパスは `$Profile` に格納されている。

```
## プロフィールファイルが存在するかどうかを確認
PS > Test-Path $Profile

## 上記で False と表示された場合、ファイルを作成しておく
PS > New-Item –Path $Profile –Type File –Force

## PowerShell 起動時に実行したいコマンドを書き込む
PS > notepad $PROFILE
```

なお、powershell 起動時に `$Profile` が実行されるようにするためには、`Set-ExecutionPolicy Unrestricted`, `Set-ExecutionPolicy Bypass` 等で実行ポリシーを変更しておく必要がある。

参考:

* [How to Create a PowerShell Profile](http://www.howtogeek.com/126469/how-to-create-a-powershell-profile/)
* [Tech TIPS：WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する - ＠IT](http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)

## コマンドレットではないコマンドをコマンドレットに変換して表示する

それ専用のものはないっぽけど、

```
Get-Help clear
```

とかやると `clear` が Clear-Host のエイリアスであることが分かる。

また、

```
Get-Help -Category:Alias
```

でエイリアスの一覧を表示できる。


## 未分類

## サービス

### サービス起動/停止/一時停止/再起動

### サービスの起動タイプ取得・変更

### サービス登録

## 基本

## cat/head/tail/wc する

`Get-Content` でいろいろできるっぽい。
単純なテキストのファイル書き込みは `Set-Content`

## sleep する

```
Start-Sleep -Seconds:5
```

### grep する

### Web からファイルをダウンロードする

```
PS > Invoke-WebRequest -Uri http://files.kaoriya.net/goto/vim74w64 -OutFile vim.zip
```

参考: [PowerShell で wget のようにファイルダウンロードをしたい - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2013/07/09/220710)

### zip を展開する

```
PS > function Expand-ZIPFile($file, $destination) {
  $shell = new-object -com shell.application
  $zip = $shell.NameSpace($file)
  foreach($item in $zip.items()) {
    $shell.Namespace($destination).copyhere($item)
  }
}
PS > mkdir vim
PS > Expand-ZipFile -File vim.zip -Destination vim
```

参考: [How to Extract ZIP Files Using PowerShell](http://www.howtogeek.com/tips/how-to-extract-zip-files-using-powershell/ "How to Extract ZIP Files Using PowerShell")

## アプリケーション

### git を使えるようにする

### vim を使えるようにする

```
function Expand-ZIPFile($file, $destination) {
  $shell = new-object -com shell.application
  $zip = $shell.NameSpace($file)
  foreach($item in $zip.items()) {
    $shell.Namespace($destination).copyhere($item)
  }
}

## vim ダウンロード
Invoke-WebRequest -Uri http://files.kaoriya.net/goto/vim74w64 -OutFile "${Env:Tmp}\vim7w64.zip"

## ダウンロードした zip ファイルを ProgramFiles フォルダへ展開
Expand-ZipFile -File "${Env:Tmp}\vim7w64.zip" -Destination $Env:ProgramFiles

## 展開されたディレクトリにパスを通す
$Env:Path += ";${Env:ProgramFiles}\vim74-kaoriya-win64\"

## vim 起動
vim
```

WinRM 経由では vim を起動できなかった…。


### ページャでファイルを読む

more は普通に使える。less (前後移動) はできない (?)

## ネットワーク

### 名前解決できるようにする (ニフティクラウド限定)

[クラウド上のサーバーで名前解決ができない。 | ニフティクラウド](http://cloud.nifty.com/cs/catalog/cloud_faq/catalog_130610001324_1.htm "クラウド上のサーバーで名前解決ができない。 | ニフティクラウド")

とりあえず Google の DNS サーバーを設定しておく。

```
## グローバルインターフェースの設定を表示し InterfaceIndex をメモ
PS > Get-NetConnectionProfile -IPv4Connectivity Internet

## 上記の InterfaceIndex に対して Google の DNS サーバーを設定
## InterfaceIndex は 13 ではなく 14 だったりそのときによって変わるっぽいので注意
PS > Set-DNSClientServerAddress -interfaceIndex 13 -ServerAddresses("8.8.8.8", "8.8.4.4")

## 名前解決できるようになっていることを確認
PS > Resolve-DnsName -Name www.google.com
```

## 管理

## OS 起動・停止・再起動

```
Start-Computer
Stop-Computer
Restart-Computer
```

あたり。

### Windows Server Core および最小インストールに切り替える

```
PS > Uninstall-WindowsFeature Server-Gui-Mgmt-Infra,Server-Gui-Shell -Restart
```

参考: [Windows Server 2012クラウドジェネレーション：第6回　不要な機能を省いて安全性を高めたServer Core (2/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1303/07/news080_2.html)

### WinRM サービスを有効化する

```
Enable-PSRemoting -Force
Set-NetConnectionProfile -InterfaceAlias (Get-NetConnectionProfile -IPv4Connectivity Internet).InterfaceAlias -NetworkCategory Private
```

場合によっては BASIC 認証を有効化する必要もあるかも。 (Ansible 経由で WinRM ログインする場合等？)

```
PS > winrm get winrm/config/service/auth
PS > winrm set winrm/config/service/auth '@{Basic="true"}'
```

ruby の winrm gem を利用するには [WinRM/README.md at master · WinRb/WinRM](https://github.com/WinRb/WinRM/blob/master/README.md) に書いてあるように下記が必要だった。

```
winrm set winrm/config/client/auth @{Basic="true"}
winrm set winrm/config/service/auth @{Basic="true"}
winrm set winrm/config/service @{AllowUnencrypted="true"}
```

参考:

* [NiftyCloud - ニフティクラウド 上の SQL Server 2012 R2 サーバーに Windows 7 から WinRM 経由でログインする - Qiita](http://qiita.com/tily/items/30414b629e75114025b5)
* [AnsibleからWindowsを叩く | 雲間を泳ぐ](http://sebas.kzmx.net/archives/115 "AnsibleからWindowsを叩く | 雲間を泳ぐ")

### Windows Server Core でコマンドプロンプトを落としてしまった場合の対処方法

1. Ctrl+Shift+ESC でタスクマネージャーを表示
2. ミニマムモードみたいなやつになっているので「詳細」をクリック
3. 「ファイル」メニューから「新しいタスクの実行」をクリック
4. `cmd` や `powershell` と入力して OK をクリック

参考: [Server Coreでコマンド・プロンプトを表示させる－ ＠IT](http://www.atmarkit.co.jp/fwin2k/win2ktips/1104corecmd/corecmd.html)

## メモ・疑問

* Windows 7 では `Get-Disk` というコマンドレットが使えないが Windows Server では `Get-Disk` が使えるのはなぜか？

## 参考

* [PowerShell サービス取得・変更を行うコマンドレットのまとめ - 元「なんでもエンジニ屋」のダメ日記](http://nasunoblog.blogspot.jp/2014/01/powershell-get-service-matome.html "PowerShell サービス取得・変更を行うコマンドレットのまとめ - 元「なんでもエンジニ屋」のダメ日記")