WindowsのPowerShellメモ #1

#概要
今回は業務上で使うPowerShellについてメモです。
PowerShellの実行関連及びSQL処理のCRUDコード、SQL結果をCSVファイルに保存する内容です。

#PowerShellとは

PowerShellとは、Microsoftが開発したスクリプト言語およびキャラクターユーザーインターフェイス（CUI） の1つです。

CUIは主にテキストを使って、パソコンを動かしているWindows OSへ直接コマンド命令を下せます。 たとえば、指定のプログラムを起動したり、ファイルの位置を移したりすることが可能です。

コマンド（文字入力）という名の通り、PowerShellを直接操作するのにマウスは必要ありません。コマンドによりPCの動作制御をおこなえるソフトウェアですので、PowerShellを使えばキーボード1つでPCのほとんどを操作することが可能です。 

#PowerShell（パワーシェル）とコマンドプロンプトの違い 
Windowsには今まで「コマンドプロンプト」というCUIが存在していました。しかし、現在では「コマンドプロンプトに置き換わるもの」 としてPowerShellが標準搭載されています。

PowerShellと「コマンドプロンプト」はどちらも同じCUIですが、後発のPowerShellは「コマンドプロンプト」が抱えているいくつかの問題点を改良した作りになっている点が注目ポイントです。

現在でも「コマンドプロンプト」を使えますが、PowerShellを利用できる環境であれば特に目的がない限りはPowerShellの利用がベストです。なぜなら、Windows 7のサポート終了でWindows 10へアップグレードすることが推奨されているように、今後は「コマンドプロンプト」に代わってPowerShellが普及していくと考えられるからです。

#PowerShellの起動
下記のメニュー順にPowerShellを起動します。

[スタート]->[Windows PowerShell]-[Windows PowerShell or Windows PowerShell x86]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/c99eee89-8bbc-abec-c2c0-5ce5ebf88cc0.png)

実行すると次のようなプロンプト画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/e7c0993f-e0b2-7d19-5a33-086d06c0c142.png)


#PowerShell文法について
下記の二つのサイトを参照してみてください。

①「PowerShell基本文法」の記事一覧
https://cheshire-wara.com/powershell/category/ps-textbooks/basic-grammar/

②PowerShell基礎文法最速マスター
http://winscript.jp/powershell/202

#PowerShellからSQLサーバへ接続
次のサンプルコードでSQLサーバへ接続し、DBのレコード情報を表示します。

~~~bash
# 接続情報設定
$strServer   = 'xxx.xxx.xxx.xxx';  # サーバーを指定
$strDatabase = 'xxxxx';            # データベースを指定
$strUserId   = 'xxxxx';            # ユーザーIDを指定
$strPassword = 'xxxxx';            # パスワードを指定

$cnnstr = "Data Source=$strServer;Initial Catalog=$strDatabase;User ID=$strUserId;Password=$strPassword;"

$cnn = New-Object -TypeName System.Data.SqlClient.SqlConnection $cnnstr

try {
    $cnn.Open()
    $cmd             = $cnn.CreateCommand()
    $cmd.Connection  = $cnn
    $cmd.CommandText = "select id, name, tel from  members"
    $adpter          = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter $cmd;
    $ds              = New-Object -TypeName System.Data.DataSet;

    $adpter.Fill($ds)
    $table = $ds.Tables[0]

    foreach ($row in $table.Rows) {
        Write-Output($row.item("id").tostring() + "/" + $row.item("name") + "/" + $row.item("tel"))
    }
}
catch {
    Write-Output $Error[0].Exception.Message
} finally {
    $cnn.Close()
    $cnn.Dispose()
}
~~~

#実行
次のコマンドで実行します。

~~~bash
c:\project>PowerShell .\db.ps1
.\db.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\project\db.ps1 を読み込むことができませ
ん。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\db.ps1
+ ~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
~~~

上記のようなエラーが発生しているので、あれば次のオプションを指定して再実行します。

~~~bash
PS C:\project> PowerShell -ExecutionPolicy RemoteSigned .\db.ps1
2
test1/テスト１/123-1234-1111
test2/テスト２/111-1456-1234
PS C:\project>
~~~

DBへ登録したレコードがプロンプト画面に表示されていることが確認できます。
エラーの原因については下記のサイトを参照してください。
管理者の権限がない場合は、上記のように実行が必要です。

■参考サイト
・PowerShell のスクリプトが実行できない場合の対処方法
https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750

#取得した結果をCSVファイルに保存
上記のソースコードに次のコードを追加します。

~~~bash
    foreach ($row in $table.Rows) {
        Write-Output($row.item("id").tostring() + "/" + $row.item("name") + "/" + $row.item("tel"))
    }
	#下記の1行を追加
	$table | Export-Csv -Path C:\project\member.csv -Encoding UTF8 -NoTypeInformation
~~~

#実行
次のコマンドでコードを実行するとレコードの結果が表示され、同じフォルダにCSVファイルが保存されていることが確認できます。

~~~bash
PS C:\project> PowerShell -ExecutionPolicy RemoteSigned .\db.ps1
2
test1/テスト１/123-1234-1111
test2/テスト２/111-1456-1234
PS C:\project>
~~~

下記は保存されたCSVファイルとその内容です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/e8f645bf-50c8-391a-b698-34cd4a3df357.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/5c42fced-a206-79b6-247b-f1ddd784d516.png)

#終わりに
PowerShellはPythonと似ているように見えますね。書き方はちょっと違うかもしれないですが、難しくはないですね。
PowerShellは初期設定ではすべてのスクリプトの実行を制限されているので、管理者権限がない場合、オプションの指定が必要みたいです。
そしてソースコードをOutlookへ送るとウィルスと認識されてファイルを送ることができないです。やるとしたら拡張子を画像ファイルに変更すると送れます。その後、拡張子を変更し解凍すれば問題ないです。
今日はここまでです。ありがとうございます。

#参照サイト
・PowerShell(パワーシェル)は何ができるの？メリット、使い方、実例まで
https://www.dospara.co.jp/5info/cts_str_pcuse_powershell

・PowerShell入門。できることや基礎文法、業務自動化の方法を解説【事例あり】
https://goworkship.com/magazine/powershell/#UnixBashPowerShell

・PowerShell からSQL Server データをレプリケーション
https://www.cdata.com/jp/kb/tech/sql-odbc-powershell.rst

・PowerShellからSQLServerへ接続
https://omoisan.hatenablog.com/entry/20170415

・PowerShell Cmdlets でSQL Server データをCSV にエクスポート
https://www.cdata.com/jp/kb/tech/sql-powershell-piping-cmdlets.rst