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.CurrentUserCurrentHostC:\Documents and Settings\yottun8\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps11
    $PROFILE.CurrentUserAllHostsC:\Documents and Settings\yottun8\My Documents\WindowsPowerShell\profile.ps12
    $PROFILE.AllUsersCurrentHostC:\WINDOWS\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps13
    $PROFILE.AllUsersAllHostsC:\WINDOWS\system32\WindowsPowerShell\v1.0\profile.ps14

プロファイル作成

  • 全ユーザ共通のプロファイル
    PS> New-Item -ItemType file -Path $PROFILE.AllUsersAllHosts -force
    PS> notepad.exe $PROFILE.AllUsersAllHosts
    function prompt {    <- "function prompt"で設定した内容がプロンプトとして表示される
     "PS> "
    }

プロセス

項目の意味

項目意味
HandlesHandlecount
NPM(K)NonpagedSystemMemorySize
PM(K)PagedMemorySize
WS(K)WorkingSet
VM(M)VirtualMemorySize
CPU(s)TotalProcessTime
IdPID
ProcessNameProcessName

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> Set-Alias -Name エイリアス名 -Value コマンド
  • 読み取り専用エイリアスの変更
    PS> Set-Alias -Name エイリアス名 -Value コマンド -Force
  • 定数エイリアスの変更はForceオプションを使ってもできない。(削除も不可)

エイリアスの削除

PS> Remove-Item Alias:/エイリアス名
  • Constantオプションを付加して作成された定数エイリアスは、Forceオプションを使っても削除できない。

日付

今日の日付

  • 日時(date)
    PS> Get-Date
  • 曜日など
    PS> (Get-Date).DayOfWeek    <- 他に、.Year .Month .Day .Hour .Minute .Second .DayOfYear など

日付計算

  • 今日から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> Get-PSDrive -PSProvider FileSystem
  • レジストリのみ確認
    PS> Get-PSDrive -PSProvider Registry

システムの復元

システム復元の有効化・無効化

PS> Enable-ComputerRestore -Drive "C:\"           <- Cドライブのシステム復元有効化
PS> Disable-ComputerRestore -Drive "C:\","D:\"    <- CドライブとDドライブのシステム復元無効化

復元ポイントの作成

PS> Checkpoint-Computer -Description "point1" -RestorePointType MODIFY_SETTINGS
RestorePointType
APPLICATION_INSTALLAPPLICATION_UNINSTALLDEVICE_DRIVER_INSTALL
MODIFY_SETTINGSCANCELLED_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のほうが速い

  • foreach
    PS> (Measure-Command {foreach $i in 1..1000000 {$j += $i}}).TotalMilliseconds
    2198.8895
  • ForEach-Object
    PS> (Measure-Command{1..1000000 | ForEach-Object {$j += $_}}).TotalMillseconds
    80529.0222
  • 結果
    • foreachのほうが1ステップで処理を完了させているため速い
    • ForEach-Objectというよりは、その前のパイプ処理に負荷(時間)がかかっている

連想配列への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ミリ秒でしかないので、実用上はどちらを利用しても全く問題ない

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-05-30 (水) 14:23:00 (2394d)