これらがわかれば色々PowerShellでバッチ作れるメモ

■実行ポリシーの変更

スクリプトの実行がシステムで無効になっているため..」が出る。
Set-ExecutionPolicy RemoteSigned
Y
でポリシー変更によりPSが実行できるようになる。


■ファイル名

Script.ps1 拡張子が ps1 だ。
コマンドプロンプトより powershell 打ち
PS C:\> より
PS C:\>C:\Script.ps1 で実行


■イベントログへのログ出力機能

if ([System.Diagnostics.EventLog]::SourceExists("ScriptName") -eq $FALSE){
New-EventLog -LogName Application -Source ScriptName
}
Write-EventLog -LogName Application -EntryType Error -Source ScriptName -EventId 901 -Category 0 -Message "Power Shell Error Test"
Write-EventLog -LogName Application -EntryType Warning -Source ScriptName -EventId 901 -Category 0 -Message "Power Shell Warn Test"
Write-EventLog -LogName Application -EntryType Information -Source ScriptName -EventId 901 -Category 0 -Message "Power Shell Info Test"

# ソースを削除する場合
#Remove-EventLog -Source ScriptName

■文字列同士の連結

 +演算子で接続


■変数の利用

変数は頭に$を付ける。
$a = 100 という書き方。
連想配列
$hash_table = @{one = 1; two = 2; three = 3} で初期化

$hash_table.Add("four", 4) で追加
$hash_table.Remove("three") で除去
繰り返しは
foreach ($key in $hash_table.Keys) {
$key + ":" + $hash_table[$key]
}

存在確認は
$hash_table.ContainsKey("four") でキーにあるか True、なければFalse

■設定ファイルの参照

 可能
config.ini に以下のように書いたとして
; configure
name1=value1
name2=value2
name3=value3
 
function read_ini($filename)
{
$lines = get-content $filename
foreach($line in $lines){
# コメントと空行を除外する
if($line -match "^$"){ continue }
if($line -match "^\s*;"){ continue }

$param = $line.split("=",2)
write-host("key : " + $param[0])
write-host("val : " + $param[1])
}
}
read_ini ".\config.ini"

■PSファイルのスケジューラでの実行方法は?

http://www.atmarkit.co.jp/ait/articles/1412/03/news125.html
にある通り、注意が必要らしい

■起動時の引数渡せるか

param($a=1) とやると、起動時に

c:\test\aaa.ps1 150000

とすると$a = 150000 が代入されてくる。



ディレクトリ参照、ファイル名の降順とかファイルの操作

$hashFileNames =@{}
$path = "C:\test"
$wildcard = 'AAAA-BBBB-*'
$directoryItems = Get-ChildItem -Include $wildcard -Path $path -Recurse | Sort-Object LastWriteTime -Descending
foreach ($item in $directoryItems) {
if ($item.Attributes -eq "Directory") {
continue
}
Write-Output $item.Name
$fullpath = foreach-object -process { $item.FullName }
#Write-Output $fullpath
# 連想配列に追加
$hashFileNames.Add($item.Name, $fullpath)
}
# 連想配列に入っているれば取得
foreach($key in $hashFileNames.Keys){
Write-Host $key " " $hashFileNames[$key]
}

■日付の扱い

$yesterday = (Get-Date).AddDays(-1) これ昨日だ。
$yesterday = (Get-Date).AddDays(-1).ToString("yyyy-MM-dd")


CSVファイルの参照制御

servers.csv というCSVファイル
hostname os version

                • -- -------

server1 ReHat Enterprise Linux 6.5
server2 Windows Server 2012R2

Import-Csv 'servers.csv' | ForEach-Object {
$_.hostname
}
↑↑↑↑↑↑上記だとUTF-8じゃないと扱えなかった。なので以下で実施。

$file = "c:\test\log.csv"
$headerstr = "タイムスタンプ,イベント,アラート,氏名,ログイン"
$header = $headerstr -split ","
$csv = Get-Content $file | ConvertFrom-Csv -Header $header
$csv | ForEach-Object {
Write-Host ("[{0}] {1} - {2}" -f $_."タイムスタンプ", $_."イベント", $_."氏名")
}

■固定長ファイルの編集出力制御

 ・パディングみたいなのできる?
  $testText = 'abc'
  $testText.PadRight(10) ⇒ "abc "
  $testText.PadLeft(10) ⇒ " abc"

で固定長づくりできる。


 ・テキストファイル出力
# 出力ファイル名
[String]$output_file = "C:\test.txt"
# ファイルストリームをオープン(SJIS..MS932)
$sw = New-Object System.IO.StreamWriter($output_file, $false, [Text.Encoding]::GetEncoding(932))
# テキスト書き込み
$sw.WriteLine("いちぎょうめ")
$sw.WriteLine("にぎょうめ")
$sw.WriteLine("さんぎょうめ")
# ファイルストリームクローズ
$sw.Close()

FTPファイル転送制御

$user = ''
$password = ''
$url = 'ftp:///'

$wc = New-Object System.Net.WebClient
$wc.Credentials = New-Object System.Net.NetworkCredential($user,$password)
$wc.BaseAddress = $url
try{
$wc.UploadFile("","")
Write-Host "FTP UPLOAD SUCCESS"
} catch [Exception] {
Write-Host "FTP UPLOAD ERROR"
}finally{
$wc.Dispose()
}

■ブール値やNULL の書き方

 true : $TRUE
 false: $FALSE
 null : $NULL