PowerShell_Tips †
プロファイル †
プロファイル一覧取得 †
PS> $PROFILE | Get-Member -MemberType NoteProperty | Format-Table -Property name -HideTableHeaders
PS> $PROFILE.AllUsersAllHosts <- こんな感じで調べる
C:\WINDOWS\system32\WindowsPowerShell\v1.0\profile.ps1
- 一覧
プロファイル | ファイルパス | 優先度(1:最高) |
$PROFILE.CurrentUserCurrentHost | C:\Documents and Settings\yottun8\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 | 1 |
$PROFILE.CurrentUserAllHosts | C:\Documents and Settings\yottun8\My Documents\WindowsPowerShell\profile.ps1 | 2 |
$PROFILE.AllUsersCurrentHost | C:\WINDOWS\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1 | 3 |
$PROFILE.AllUsersAllHosts | C:\WINDOWS\system32\WindowsPowerShell\v1.0\profile.ps1 | 4 |
プロファイル作成 †
プロセス †
項目の意味 †
項目 | 意味 |
Handles | Handlecount |
NPM(K) | NonpagedSystemMemorySize |
PM(K) | PagedMemorySize |
WS(K) | WorkingSet |
VM(M) | VirtualMemorySize |
CPU(s) | TotalProcessTime |
Id | PID |
ProcessName | ProcessName |
CPU利用時間の多い上位3件を取得する †
PS> Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 3
プロセスの起動と停止 †
- 通常
- 状態取得
PS> Get-Service -Name "WebClient"
- 起動
PS> Start-Service -Name "WebClient"
- 停止
PS> Stop-Service -Name "WebClient"
プロセスのAffinity Mask(関連づけるCPU)を設定する †
PS> (Get-Process -Name firefox).ProcessorAffinity = 1 <- 1 : CPU0、2 : CPU1、3 : CPU0,1、4 : CPU2 ・・・
コマンド †
コマンド一覧確認 †
PS> Get-Command
コマンドレット一覧確認 †
PS> Get-Command -CommandType Cmdlet
関数一覧確認 †
PS> Get-Command -CommandType Function
エイリアス一覧確認 †
PS> Get-Command -CommandType Alias
エイリアス †
エイリアス一覧確認 †
PS> Get-Alias
コマンドレットに対応するエイリアスを確認 †
PS> Get-Alias -Definition コマンドレット名
エイリアスの作成 †
- 基本
PS> New-Alias -Name エイリアス名 -Value コマンド
- 既に同じ名前のエイリアスが存在する場合は上書きする
PS> New-Alias -Name エイリアス名 -Value コマンド -Force
- 読み取り専用エイリアスの作成
PS> New-Alias -Name エイリアス名 -Value コマンド -Option ReadOnly
- 定数エイリアスの作成
PS> New-Alias -Name エイリアス名 -Value コマンド -Option Constant
エイリアスの変更 †
エイリアスの削除 †
PS> Remove-Item Alias:/エイリアス名
- Constantオプションを付加して作成された定数エイリアスは、Forceオプションを使っても削除できない。
日付 †
今日の日付 †
日付計算 †
- 今日から1年後の日付
PS> (Get-Date).AddYears(1)
- 今日から3日前の日付
PS> (Get-Date).AddDays(-3)
- "2000/01/01"から10000日後の日付
PS> ([DateTime]"2000/01/01").AddDays(10000)
- "2000/01/01"は今日から何日前か
PS> ((Get-Date) - ([DateTime]"2000/01/01")).Days
日付のフォーマット(整形) †
PSDrive作成(Windows Power Shell専用マウントポイントなので、NET USEでは出てこない) †
PS> New-PSDrive -Name P -PSProvider FileSystem -Root C:\Tool
PS> Set-Location P:
PS> Get-Location
C:\Tool
PSDrive確認 †
PS> Get-PSDrive
システムの復元 †
システム復元の有効化・無効化 †
PS> Enable-ComputerRestore -Drive "C:\" <- Cドライブのシステム復元有効化
PS> Disable-ComputerRestore -Drive "C:\","D:\" <- CドライブとDドライブのシステム復元無効化
復元ポイントの作成 †
PS> Checkpoint-Computer -Description "point1" -RestorePointType MODIFY_SETTINGS
RestorePointType |
APPLICATION_INSTALL | APPLICATION_UNINSTALL | DEVICE_DRIVER_INSTALL |
MODIFY_SETTINGS | CANCELLED_OPERATION | |
アカウント †
アカウントの状態確認 †
PS> Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount=True and Name='Guest'" | Select-Object Name, Status
ロック解除 †
COMオブジェクト †
Excelオブジェクトの作成 †
PS> $A = New-Object –ComObject Excel.Application
PS> $A.Visible = $True
PS> $B = $A.Workbooks.Add()
PS> $C = $B.WorkSheets.Item(1)
PS> $C.Cells.Item(1, 1) = "test"
PS> $B.SaveAs("C:\test.xls")
PS> $A.Quit()
Access DBへの接続 †
PS> $A = New-Object -ComObject ADODB.Connection
PS> $B = New-Object -ComObject ADODB.RecordSet
PS> $A.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\test.mdb")
PS> $B.Open("Select * From Table1", $A, 3, 3) <- (adOpenStatic, adLockOptimistic)
PS> Do {$B.Fields.Item("Columns1").Value: $B.MoveNext()} Until($B.EOF -eq $True)
PS> $B.Close()
PS> $A.Close()
タスクスケジューラ †
タスクの実行 †
PS> $A = New-Object -ComObject Schedule.Service
PS> $A.Connect()
PS> $A.GetFolder(フォルダパス).GetTask(タスク名).Run
例.手動デフラグのタスクを実行する
PS> $A.GetFolder("\Microsoft\Windows\Defrag").GetTask("ManualDefrag").Run
エラー応答 †
エラーを無視する。 †
PS> Get-ChildItem HKLM: -ErrorAction "SilentlyContinue"
- Get-ChildItemは一例。-ErrorActionは共通パラメータなので、どのコマンドレットでも使用可能。
- コマンドが強制終了しないレベル(警告レベル)のものに限り有効。強制終了してしまう程のエラーには対処できない。
エラー(例外)をトラップする †
PS> Trap {"exception trapped."; continue}
PS> Trap [System.Exception]{"exception trapped."; continue}
- 通常のコマンドラインでも利用できるが、スクリプトで利用することが多い。(スクリプト内での利用の方が幅広く使える)
- トラップ後の対応には、"continue"以外に"break"などもある。
出力 †
文字出力(echo) †
PS> Write-Host "foo"
foo
$a = "bar"
PS> Write-Host $a
bar
ページ送り出力(more) †
PS> 画面出力を返すコマンド | more
PS> 画面出力を返すコマンド | Out-Host -Paging
PS> Out-Host -InputObject 画面出力を返すコマンド -Paging
- moreの方が余計なものを出力しないので使いやすいが、コマンドレットして渡したいならOut-Hostで。
文字の色を変更する †
PS> Write-Host -ForegroundColor red
文字の背景色を変更する †
PS> Write-Host -BackgroundColor green
ちょっとした応用(上:省略形、下:基本形) †
ls -lhSr †
PS> ls | sort length -desc | ft Mode,LastWriteTime, @{name="Length(KB)";expression={($_.length / 1kb).tostring("0")}}, Name -a
PS> Get-ChildItem | Sort-Object -Property Length -Descending | Format-Table -Property Mode, LastWriteTime, @{Name="Length(KB)";Expression={($_.Length / 1KB).ToString("0")}}, Name -AutoSize
du -s †
PS> (ls -recurse | measure length -sum).sum
PS> (Get-ChildItem -Recurse | Measure-Object -Property Length -Sum).Sum
2GBを超えたファイルを削除する †
PS> ls | ? {$_.length -gt 2GB} | % {rm $_.fullname}
PS> Get-ChildItem | Where-Object {$_.Length -gt 2GB} | ForEach-Object {$_.FullName}
本当の意味でのTips †
foreachとForEach-Objectでは、foreachのほうが速い †
連想配列へのContainsとContainsKeyは、ほぼ同じ速さ †
- Contains
PS> $a = @{foo = 1; bar = 2; baz = 3}
PS> (Measure-Command {for ($i = 0; $i -lt 1000000; $i++) {if ($a.Contains("foo") {}}}).TotalMillseconds
6550.2907 <- 1000000回実行しての平均値
- ContainsKey
PS> $a = @{foo = 1; bar = 2; baz = 3}
PS> (Measure-Command {for ($i = 0; $i -lt 1000000; $i++) {if ($a.ContainsKey("foo") {}}}).TotalMillseconds
6604.7169 <- 1000000回実行しての平均値
- 結果
- 厳密に言えば、何度実行しても常に10-100ミリ秒単位でわずかにContainsのほうが速い(ただ、環境によって逆の結果になることが充分にありえる程度)
- 1000000回実行しての10-100ミリ秒でしかないので、実用上はどちらを利用しても全く問題ない