ラベル PowerShell の投稿を表示しています。 すべての投稿を表示
ラベル PowerShell の投稿を表示しています。 すべての投稿を表示

2016年4月12日火曜日

[PowerShell] 標準出力時に、文字の色を一部分だけ変える

標準出力を行ったとき、1行中の特定のデータを色付きで表示したい
と思ったので、調べた結果を覚書。


PS> Write-Host "a" -NoNewline; Write-Host "b" -ForegroundColor Red -NoNewline; Write-Host "c";
abc

-ForegroundColorで文字色を、-BackgroundColorで背景色を変更できるようです。

あとは"a"、"b"、"c"を適当な変数に変えるとかすれば目的達成ですかね。
なかなか情報が見つかりませんでしたが、とりあえずこんな感じで。

2016年2月18日木曜日

[PowerShell & SQL*Plus] 文字化けの対処法

PowerShellからSQL*Plusを起動、英語環境(AMERICAN_AMERICA.WE8MSWIN1252)の
OracleにアクセスしてDBA_OUTSTANDING_ALERTSを確認したとき、
メッセージが文字化けする問題を解決したので覚書。

■対応1
PS> SET NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
PS> sqlplus sys/PASS@SID as sysdba

SQL> SELECT REASON FROM DBA_OUTSTANDING_ALERTS;
⇒文字化け


■対応2
PS> chcp 65001
PS> SET NLS_LANG=AMERICAN_AMERICA.AL32UTF8
PS> sqlplus sys/PASS@SID as sysdba

SQL> SELECT REASON FROM DBA_OUTSTANDING_ALERTS;
⇒文字化け

■対応3
PS> SET NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
PS> sqlplus sys/PASS@SID as sysdba

SQL> ALTER SESSION SET NLS_LANGUAGE=AMERICAN;
SQL> ALTER SESSION SET NLS_TERRITORY=AMERICA;
SQL> SELECT REASON FROM DBA_OUTSTANDING_ALERTS;
⇒文字化けしない!


DOSからの場合はNLS_LANGの変更だけで文字化け発生しなかったんですが。。
とりあえず解決できてよかった。

2015年8月26日水曜日

[C# / PowerShell] C#からPowerShellを実行する方法

PowerShellを動的かつ並列実行したかったので、C#で書いてみました。

  private List<string> executePowerShell()
  {
    // PowerShellスクリプト
    string script = @"
      # C#からの引数の受け取り
      $count = 0
      foreach($arg in $input)
      {
        switch ($count)
        {
          0 { $foo = $arg }
          1 { $bar = $arg }
        }
        $count++
      }

      # 何らかの処理

      # C#に返したい変数
      $foo
      $bar
    ";

    List<string> fromPowerShell = new List<string>();

    using (var invoker = new RunspaceInvoke())
    {
      // PowerShellの実行、第二引数がPowerShellに渡す引数
      var psResult = invoker.Invoke(script, new[] { 0, 1 })

      // PowerShellから変数の値を受け取る($foo, $bar)
      foreach (PSObject result in psResult)
      {
        if (result != null) { fromPowerShell.Add(result.ToString()); }
      }
    }

    return fromPowerShell;
  }

こんな感じのメソッドを用意して、 script を動的生成 & Parallel.Forでクルクル回す、と。
例外処理は記載してませんが。。

2015年1月22日木曜日

[PowerShell] Import-Csvで環境依存エラー?

csvファイルを読み込んで処理するPowerShellスクリプトを
他の人に使ってもらおうとしたところ、なぜかエラーが。。


Import-Csv : パラメーター名 'Encoding' に一致するパラメーターが見つかりません。


PowerShellのバージョン問題かと思ってMSDNを調べてみるも
特にバージョン○○から、という記載がない。

急ぎではないけれど、早めに原因調べたいなぁ。。。


1/23
詳しい人に聞いたところ、やっぱりPowerShellのバージョンが原因っぽい。

2014年7月2日水曜日

[PowerShell] コマンドの実行結果を表示しない方法

DOSの @echo off みたいに、コマンドの実行結果を
表示しない方法について、なかなか見つかりませんでしたが
ようやく見つけたので覚書。

PS> net use \\ServerName
コマンドは正常に終了しました。

PS> net use \\ServerName /delete
\\ServerName が削除されました。


を以下のようにすると、あら不思議。

PS> net use \\ServerName | Out-Null
PS> net use \\ServerName /delete | Out-Null


方法が見つかってスッキリ(*´∀`*)

2014年6月12日木曜日

[PowerShell] 比較演算子にハマる

色々とPowerShellを書いてたら、ps1ファイルのあるフォルダに
なぜか「0」というファイルが作られている。。。

なんでや!

PS> $array = @()
PS> $array += ・・・
PS> if ($array.Length > 0) {
PS>     ・・・
PS> }



・・・



($array.Length > 0)



おまえか!



ついつい癖で不等号使ってしまったorz
-gt 使わないといけないんでしたね。。

ということでこんな感じで書き換えたら解決。

PS> $array = @()
PS> $array += ・・・
PS> if ($array.Length -gt 0) {
PS>     ・・・
PS> }

2014年6月11日水曜日

[PowerShell] リモートからHDDの空き容量を調べる

イベントログを見ることができるんだから、ディスクの空き容量を調べることもできるだろう、
ということでこんな感じで書いてみた。

PS> $username = "username"
PS> $sPassword  = ConvertTo-SecureString -String "password" -AsPlainText -Force
PS> $credential = New-Object System.Management.Automation.PSCredential($username, $sPassword)
PS> $hdd_list = Get-WmiObject -Class win32_logicaldisk -ComputerName "host-name"
-Credential $credential
PS> $msg = ""
PS> foreach($hdd  in $hdd_list) {
PS>     $driveLetter = $hdd.DeviceID -replace(":", "")
PS>     $freeSpace = [string] ([math]::round($hdd.FreeSpace / ([math]::pow(1024, 3)), 2))
PS>     $msg = "Freespace of " + $driveLetter + " drive is " + $freeSpace + "(GB)."
PS> }
PS> $msg

# 2015.04.09 1行目を追記。ご指摘ありがとうございます。

[PowerShell] リモートからイベントビューアを見る

サーバのチェックを行うのに一々リモートデスクトップ接続するのは面倒。
(特にチェックするサーバが多ければ多いほど)

ということで、作業PCからPowerShellを使用し、
リモートでイベントビューアを表示する方法を調べてみた。

PS> # 共有リソースに接続
PS> net use \\[host-name or ip-address] [password] /user:[user-name]
PS>
PS> # イベントログを表示
PS> Get-EventLog system -ComputerName [host-name or ip-address]

過去n日間に発生したシステムエラーの件数を表示したいならこんな感じ

PS> net use \\[host-name or ip-address] [password] /user:[user-name]
PS>
PS> # ndays はマイナスの値にすること
PS> $ndays = -3
PS> $error_count = Get-EventLog system -ComputerName [host-name] | Where-Object { $_.EntryType -eq "Error" -and $_.TimeGenerated -gt (Get-Date).AddDays($ndays) } | Group-Object $_.EntryType