Hatena::ブログ(Diary)

ひまわりのむく方向

2013-04-09

お引越しします。

はてなpowershellシンタックスハイライトに対応していので、Blogger様に引越しします。

ここのネタは引越し後に削除するかもです。

ひまわりの向く方向

2013-03-06

Write-Host で表示されるメッセージに色をつける

なんとなく検索していたら面白いもの見つけたのでメモメモ。

Write-Host コマンドレットの使用

Write-Hostで表示されるメッセージに色つけれるみたい!

Write-Host "コメント" -foregroundcolor red -backgroundcolor yellow 

ってことで、各サーバのCドライブの利用状況を色別けして表示させてみるスクリプトとか作ってみた。

# 本体
function MyFunction
{

    $serverlist = @("192.168.1.1"; "192.168.1.2"; "192.168.1.3")

    #サーバリストの分だけループ
    foreach ($ipaddress in $serverlist)
    {
        Write-Host "`n"
        Write-Host "★☆★-----------------【" $ipaddress "】-----------------★☆★" -foregroundcolor red -backgroundcolor yellow 

        #実行
        #Cドライブの使用状況を表示する
        CheckDiskSize

        #Read-Host "実行結果を確認して、エンターを押してください!"
    }
}
function CheckDiskSize
{
    Write-Host "■□■ Cドライブの使用状況を表示します。 ■□■"
    #Session作成
    $Session = New-PSSession -ComputerName $ipaddress
    
    #コマンド実行
    Invoke-Command -Session $Session -Scriptblock{
        $drive = $args[0]
        #ドライブの容量チエック
        $used = (Get-PSDrive $drive).Used / 1GB
        $free = (Get-PSDrive $drive).Free / 1GB
        #使用率(四捨五入)
        $rate = [math]::Truncate((($used / ($free + $used)) * 100)+.5)

        #メッセージ作成
        $Message = $scriptName + "`n" + "`n" + 
            $drive + "ドライブの使用量:" + ([math]::Truncate($used)+.5) + "GB" + "`n" + 
            $drive + "ドライブの空き容量:" + ([math]::Truncate($free)+.5) + "GB" + "`n" + 
            $drive + "ドライブの使用率:" + $rate + "%"

        #使用率が70%以上で80%未満だったら黄色で表示
        if ($rate -gt "70" -and $rate -le "80")
        {
            Write-Host $Message -foregroundcolor Yellow
        }
        #使用率が80%以上だったら赤字で表示
        elseif ($rate -gt "80")
        {
            Write-Host $Message -foregroundcolor Red
        }
        #それ以外はセーフ
        else
        {
            Write-Host $Message -foregroundcolor Green
        }
    } -ArgumentList "C"
    
    #Session削除
    Remove-PSSession $Session

    }
}

WinRMでリストの端末に対して実行していってます。

中身読めば解りますけど、使用率に応じて色を変えて表示してます。

表示結果はこんな感じ。

f:id:skRyo:20130306193309j:image

IPの部分はちょっと隠してますゴメンナサイ)



手動でさっと確認したいときには良い感じかも。

2013-03-02

そろそろ転職活動

したいと思っているので、とりあえず現場で書き溜めたPowerShellを忘れないようにアップしまくりたいと思います。来週から。

完全に備忘録です。

2013-02-04

Invoke-CommandでリモートPCに引数を渡す

備忘録も込めたPowerShellネタです。

PowerShellでリモートPCを操作する時の方法は以下の3つみたい。

  1. <コマンドレット> -ComputerName <hogehoge>
    • コマンドを指定のリモートPCに対して実行。
    • 主体はコマンドを投げる側。
    • 当然だが、「-ComputerName」がそもそも存在しないコマンドも多数。
  2. Invoke-Command -ComputerName <hogehoge> -scriptblock{Get-Service}
    • 「-scriptblock{}」をリモートPCで実行。
    • 主体はリモートPC側。
  3. Enter-PSSession -ComputerName <hogehoge>
    • 対話モード(SSHログインみたいな感じ)でリモートPCに接続してゴニョゴニョ。
    • 主体はリモートPC側。

1で全ての業務が片付けば問題無しだが、まぁそうは問屋がおろさない。

んで、2を使ってリモートPCの操作をスクリプト化するんだけど、スコープがリモートPC側にあるので投げる側の変数がそのまま使用できない。


リモート側に「C:\Windows」は存在するが、

$hostname = "192.168.1.2"
Invoke-Command -Computername $hostname -Scriptblock{Test-Path C:\Windows}
True

変数として渡してしまうとエラーとなる。

$hostname = "192.168.1.2"
$a = "C:\Windows"
Invoke-Command -Computername $hostname -Scriptblock{Test-Path $a}
引数が null であるため、パラメーター 'Path' にバインドできません。
    + CategoryInfo          : InvalidData: (:) [Test-Path]、ParameterBindingVal 
   idationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,M 
   icrosoft.PowerShell.Commands.TestPathCommand
    + PSComputerName        : 192.168.1.2

さて、どうしましょ。。


ということで、Invoke-Commandのヘルプとにらめっこしてみると。。

あやしいのを発見。

-ArgumentList <Object[]>

コマンドのローカル変数の値を指定します。コマンドの変数は、リモート コン

ピューターでのコマンドの実行前にこれらの値で置換されます。値をコンマ区切

り一覧で入力します。値は、一覧されている順に変数に関連付けられます。Argu

mentList のエイリアスは "Args" です。

ArgumentList の値は、"1024" などの実際の値にすることも、"$max" などのロ

ーカル変数の参照にすることもできます。

コマンドでローカル変数を使用するには、次のコマンド形式を使用します。

{param($<名前 1>[, $<名前 2>]...)<ローカル変数を持つコマンド>} -Argument

List <値 | $ローカル変数>

"param" キーワードには、コマンドで使用するローカル変数を列挙します。Argu

mentList パラメーターには、変数を列挙した順にその値を指定します。

さっそく実行。配列で渡るということなので

$hostname = "192.168.1.2"
$a = "C:\Windows"
$b = "C:\Program Files"
Invoke-Command -Computername $hostname -Scriptblock{Test-Path $args[0];Test-Path $args[1]} -ArgumentList $a,$b
True
True

とりあえず上記を使用すれば目的は達成できそうです。


(という記事を書いてて見つけたんですが)こちらのような方法でも良いかも。

【PowerShell】Invole-Command –FilePath パラメタの魔法 - フィールドSEあがりの安納です - Site Home - TechNet Blogs

2012-06-27

FizzBuzz問題をやってみる

先生に「手始めにお約束のFizzBuzz問題を解いてみるのはどうか|д゚)チラッ」って言われたので、プログラムの定番問題と呼ばれるFizzBuzz問題をやってみる

とりあえずPowerShellでやってみるかーということで書いてみる


# 3で割り切れる場合は 「Fizz」、
# 5で割り切れる場合は 「Buzz」、
# 両者で割り切れる場合は 「Fizz Buzz」 を数の代わりに発言する。

function fizzbuzz ([int]$a){
    for ( $i = 1; $i -le $a; $i++){
        #3の余剰
        $s = $i % 3
        #5の余剰
        $p = $i % 5
        
        if ( $p -eq 0 -and $s -eq 0 ){
            write-host "FizzBuzz"
        } elseif( $s -eq 0 ) {
            write-host "Fizz"
        } elseif( $p -eq 0 ) {
            write-host "Buzz"
        } else {
            write-host $i
        }
        
    }
}

#実行
fizzbuzz 100

15分位?で書きました。

おー。できたできたー。って喜んでグーグル先生にお問い合わせしたら、世の中の達人プログラマーは60文字以内とかで解いててひっそりと枕を涙で濡らしました。。