Home > Windows にまつわる e.t.c.

今から使う PowerShell


初めて PowerShell を使い始める方向けに、超入門からスクリプト作成とリモートコンピュータ操作までの基本的な事をシリーズで解説します。

 

PowerShell って何?

PowerShell は Windows 7 / Windows Server 2008 R2 以降の Windows OS に標準搭載された、コマンドラインのシェルスクリプトです。

従来の DOS の コマンドや、VB スクリプトの後継で、とても強力かつ使いやすい仕様になっており、現在は OSS になり Windows だけではなく Linux や Mac OS 上でも動作するマルチプラットフォームなシェルスクリプトになっています。

 

PowerShell で何ができるの?

PowerShell は、コンピューターの状態取得や設定変更ができます。ローカルコンピューターだけではなくリモートコンピューター操作も出来るので、複数台のコンピューターの管理にとても重宝します。

PowerShell はコマンドレットと呼ばれる PowerShell 専用のコマンドを使って操作しますが、WMI や .NET オブジェクト、レジストリ、ファイルシステムなどの様々なものが簡単にハンドリングできるので「PS > GUI」と表現されることもあります。

PowerShell を使うと、Windows のほぼ全ての機能を PowerShell だけ操作出来ますし、Hyper-V などの機能を追加すると、追加した機能用のコマンドレットが追加され、PowerShell で操作できるようになります。

PowerShell は言語仕様としても強力なので、管理ツールとしてだけではなく簡易プログラミング ツールとしても使用することが可能です。

 

で、具体的にはどんなことに使えるの?

僕が実際に書いて使っているスクリプトでこんなことが出来ています。

 

・ 大量 Windows Server の新規構築

数十台から数千台の Windows Server を1時間以内に構築完了することができます。

OS さえインストールされてあれば PowerShell で全ての環境設定が可能ですし、インストールするミドルウエアがサイレントインストールをサポートしていれば、ミドルウエアのインストールも PowerShell で出来ます。

構築スクリプトを投入するだけで後は環境が出来上がるのを待つだけです。昼飯を食べに行く前に構築スクリプトを投入しておけば、昼飯を食べ終わった頃には構築が完了しているといった事が可能です。

OS のインストールメディアをカスタマイズして、OS インストール後に構築スクリプトを自動実行するように仕込んでおけば、一切手を触れずにOS インストールから環境構築までか出来ます。

何台の Server を構築しても構築の手間は変わらないので、明日の朝までにまでに緊急で100台数の環境を準備してくれと言われても鼻歌交じりで構築出来ます。

 

・大量 Windows Server の設定変更

数十台から数千台の Windows Server の設定変更が数分で完了します。

大量の Windows Server 設定を一斉変更する場合、設定変更用の PowerShell スクリプトを書いて投入すれば、数分後には全台の設定変更が完了します。

人海戦術で RDP 使って一台ずつログオンして、泣きながら GUI ポチポチな設定変更なんて必要はありませんし、クリック場所を間違えたりとか設定が漏れたとかの人的ミスも発生しません。

 

・イベントログ監視

PowerShell は、イベントログにアクセスできますし、メール送信もできます。

この機能を利用して、対応が必要なエラーがイベントログに記録されたらメールで通知する仕組みを PowerShell だけで作る事が出来ます。

PowerShell はリモートコンピュータ操作もできるので、このスクリプトを複数のコンピューターに一括セットする事も出来ます。

 

・自動 Windows Update

新規で OS をインストールすると、何度も手動で再起動して Windows Update しますが、Windows Update スクリプトを使うと、Windows Update が完了まで再起動と更新プログラムのインストール自動実行できるので、手を触れず放置できます。

何度も再起動が必要な Windows Update はそれなりに時間がかかるので、帰宅前に Windows Update スクリプトを投入し、翌日出社したら最新の更新まで適用済みって事ができます。

 

・パスワードのセキュア運用

ワークグループ環境で、リモートコンピューターに接続して何かしらの処理をするバッチ処理が必要な場合、.bat に認証に必要なパスワードを平文で書いちゃいますね。
これでは、本来秘密でなくてはならないパスワードが誰にでも見えてしまう状態になってしまうので、セキュリティ レベルが著しく下がってしまいます。

PowerShell では .NET の機能を使用して暗号/復号がする事が可能なので、パスワードを暗号化してセキュリティレベルを低下させないバッチ処理を作ることができます。

 

これ以外にも様々な運用管理用のスクリプトや、ちょっとしたツールを沢山作ってい日々使っています。

 

手順作成の手間が大幅削減

業務で Windows Server の管理をしていると、構築や設定変更時に使用する「手順書」は切っても切れない必須ドキュメントですよね。

GUI 操作をする場合、画面キャプチャを撮影し、どこをクリックして、どこに何を入力するのか事細かく書く必要がありますが、PowerShell でスクリプト化していれば、「〇〇をする場合、xxxxx.ps1 を実行する」の一言で済みますし、OS が新しくなった時は動作確認だけなのでキャプチャを差し替えも不要です。

運用に必要なのは、どんな時にどのスクリプトを使用するのかの運用手順、スクリプト実行時に読み込ませる CSV やスクリプトの config 変更に必要なの設定変更解説、スクリプトがどんな機能と構造を持っているのかのスクリプト仕様、この3つだけで基本的には事足ります。

スクリプトの可読性が高ければ、これらのドキュメントもライトに(場合によっては不要に)する事すら可能です。

 

でも難しいんでしょ?

いえいえ、とても簡単ですょ !

出来る事があまりにも多く、高度な事も出来るので、めちゃ奥が深く、全てを理解するのは難しいかもしれません。
でも、全てを理解する必要は全くありません。

自分のやりたいことを実現するために必要なことだけが分かっていれば十分です。

やりたい事の範囲が広がった時に、それに必要な知識を身に付ければ良いだけです。

僕自身も全てを理解しているわけではありません。敢えて使わない機能もたくさんあります。

なので、難しく考えずに気楽に PowerShell を使ってみるがオススメですね。

このシリーズでは段階的に PowerShell の使い方を解説するので、好きなところまで進めて、自分に合った PowerShell の使い方をして下さい。

 

PowerShell の起動と終了

さて、能書はこのくらいにして、さっそく PowerShell の使い方です。

PowerShell を使うためには、PowerShell を起動しなくてはいけませんね。

スタートメニューから「Windows PowerShell」を探しても良いのですが、手っ取り早いのは「ファイル名を指定して実行」からの起動です。

Win + R で「ファイル名を指定して実行」を起動し、PowerShell と入力して OK します。

 

PowerShell が起動したら、アイコンを右クリックしてタスクバーにピン止めしておきましょう。

 

終了する時は、exit で終了します。

 

右肩の「×」で閉じても構いません。

 

電卓がわりに PowerShell を使ってみる

まずは一番簡単な PowerShell の使い方である電卓がわりの使い方です

 

四則演算

四則演算は + - * / で計算式を入れて、Enter で計算結果を表示します。

計算の優先順位変更するためのカッコも使えます。

例では、わかりやす用に数値と演算子との間に空白を入れていますが、空白なしでもちゃんと計算されます。

 

計算結果をマウスでダブルクリックすれば、計算結果がクリップボードにコピーされるので、計算結果を目的の場所にペーストできます。

 

コンピューター単位変換

コンピューターでは KB、MB、GB、TB の単位がよく使われれますが、1KB が何バイトなのかを正確に扱うのはなかなか面倒ですね。

普通の市販電卓ではコンピューター単位を簡単に扱う事は出来ないので困っている方も多いのではないでしょうか?

PowerShell ではコンピューター単位変換が簡単できます。

たとえば、1KB が何バイトかを確認するには 1kb と入力して Enter するだけです。

 

あるいは、21GB を MB に変換する時は、21GB を 1MB で割ります

 

PowerShell では、KB, MB, GB, TB, PB まで扱う事ができます。

 

16進数を10進数に変換する

16進数を10進数に変換する場合は、16進数に 0x を付けます。

例えば、16進数の 2a を10進数に変換する場合は、0x2a とします。

 

10進数を16進数に変換する

10進数を16進数に変換する場合は、ToString メソッドを使って 16進数である "x" を指定します。

例えば、10進数の 500 を16進数に変換する場合は (500).ToString("x") とします。

PowerShell は補完が効くので、(500).To の後で TAB 入力すると .ToString( などの候補が次々と補完されます。

カッコで数値を括って、数値のメソッドである ToString が使えるようにしているのです。
メソッドについての詳しい説明は次回以降にします。

 

カンマ編集

大きな値を扱う場合、カンマ編集したい時があります。

そんな時は、ToString でカンマ編集である "#,0" を指定します。Excel のカンマ編集指定と同じですね。

例えば、1234567890 をカンマ編集する場合は、(1234567890).ToString("#,0") とします。

 

現在時刻

現在時刻を取得するには、「コマンドレット」と呼ばれる PowerShell 専用のコマンドを使用します。(コマンドレットそのものについては、次回以降に詳しく解説します)

現在時刻を取得するには Get-Date コマンドレットを使います。

 

コマンドレットは、「動詞 + 名詞」になっているので、何をするコマンドレットなのかは名前を見れば想像できるようになっています。

 

時間/日数計算

市販電卓で計算が面倒なものに時間/日数計算があります。

でも、PowerShell なら、時間/日数計算も簡単に出来ます。

例えば、時差計算をするために現在時刻から 17 時間を引く場合には、AddHours メソッドを使って (Get-Date).AddHours(-17) とします。

 

今から90日後の日付を求める場合は、AddDays メソッドを使って (Get-Date).AddDays(90) とします。

 

指定日時からの計算

指定日時から計算は、文字列を日付型に変換(キャスティング)してから計算します。

例えば、2020年7月24日の45日前を求める場合は、"2020/7/24" の文字列を [datetime] で日付にキャスティングし、([datetime]"2020/7/24").AddDays(-45) のように45日前を計算します。

 

指定日から指定日の経過日数計算が必要であれば、New-TimeSpan コマンドレットを使って New-TimeSpan 1964/10/10 2020/7/24 のように計算できます。
New-TimeSpan は、引数を日付として解釈するので [datetime] キャスティングしなくても日数計算ができます。

 

べき乗計算

PowerShell そのものがサポートしていない算術演算は、.NET を使って計算します。

例えば、べき乗計算の場合は System.Math クラスの Pow メソッドを使い [System.Math]::Pow(5, 3) のように計算します。

 

System.Math には、Pow 以外にも様々なメソッドがあり、これら全てを PowerShell で使うことができます。

Math クラス (System)
https://msdn.microsoft.com/ja-jp/library/system.math(v=vs.110).aspx

 

計算結果を変数に代入する

PowerShell は電卓がわりに使えるですが、一行に完全な式を全部書くのが大変な事もがあります。

そんな時は、変数に計算結果を入れると便利です。

PowerShell の変数は、$ を先頭に書きます。

例えば、こんな感じですね。

$a = 15 * 30
$b = 24 / 16
$a + $b

 

代入は = だけではなく、+= を使った加算代入なども使えます

$a = 20 * 4
$a += 30 - 4
$a

 

シャットダウン、再起動、ログオフ

コンピューターをシャットダウンする際には Stop-Computer コマンドレットを使います。他の誰かログオンしているとシャットダウン出来ませんが、-Force オプションをつけて Stop-Computer -Force とすれば強制シャットダウンができます。

再起動の場合は、Restart-Computer で、こいつも -Force オプションが使えます。

# シャットダウン
Stop-Computer -Force

# 再起動
Restart-Computer -Force

 

Client OS を使っている場合はログオフは馴染みが少ないのですが、Server OS の場合は、logoff.exe を呼び出してログオフするのが簡単です。

PowerSehll は、アプリケーション ランチャーとしても使えるので、logo[TAB] で補完して logoff.exe を呼び出せます。(Client OS の場合は、Pro 以上で logoff.exe が使えます)

 

今回のまとめ

PowerShell はとても高度な事ができますが、難しいものではありません。

日常の計算をする時に、引き出しから電卓を引っ張り出したり、Excel や電卓アプリを起動しなくても、日常的な電卓がわりとして PowerShell 使えます。

 

関連情報

今日から使う PowerShell
http://www.vwnet.jp/Windows/etc.asp#GettingStartedWithPowerShell

 

参考情報

PowerShellの演算子
http://www.vwnet.jp/Windows/PowerShell/Ope/OpeListg.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.