これらがわかれば色々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