*PowerShell_Tips [#r948ac93]
#contents
** プロファイル [#z6ba8903]
***プロファイル一覧取得 [#oad10fa9]
 PS> $PROFILE | Get-Member -MemberType NoteProperty | Format-Table -Property name -HideTableHeaders
 PS> $PROFILE.AllUsersAllHosts    <- こんな感じで調べる
 C:\WINDOWS\system32\WindowsPowerShell\v1.0\profile.ps1
-一覧
|プロファイル|ファイルパス|優先度(1:最高)|h
|$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|
***プロファイル作成 [#t4e458ed]
-全ユーザ共通のプロファイル
 PS> New-Item -ItemType file -Path $PROFILE.AllUsersAllHosts -force
 PS> notepad.exe $PROFILE.AllUsersAllHosts
 function prompt {    <- "function prompt"で設定した内容がプロンプトとして表示される
  "PS> "
 }
**プロセス [#u1c12caa]
***項目の意味 [#w43a0cf5]
|項目|意味|h
|Handles|Handlecount|
|NPM(K)|NonpagedSystemMemorySize|
|PM(K)|PagedMemorySize|
|WS(K)|WorkingSet|
|VM(M)|VirtualMemorySize|
|CPU(s)|TotalProcessTime|
|Id|PID|
|ProcessName|ProcessName|
***CPU利用時間の多い上位3件を取得する [#s80f9890]
 PS> Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 3
***プロセスの起動と停止 [#p05ed6fb]
-通常
--状態取得
 PS> Get-Service -Name "WebClient"
--起動
 PS> Start-Service -Name "WebClient"
--停止
 PS> Stop-Service -Name "WebClient"
***プロセスのAffinity Mask(関連づけるCPU)を設定する [#tbe769f7]
 PS> (Get-Process -Name firefox).ProcessorAffinity = 1    <- 1 : CPU0、2 : CPU1、3 : CPU0,1、4 : CPU2 ・・・
**コマンド [#n4204d0e]
***コマンド一覧確認 [#g0f54dfe]
 PS> Get-Command
***コマンドレット一覧確認 [#zb5515f8]
 PS> Get-Command -CommandType Cmdlet
***関数一覧確認 [#d73f3176]
 PS> Get-Command -CommandType Function
***エイリアス一覧確認 [#m2e2edf8]
 PS> Get-Command -CommandType Alias
**エイリアス [#h6cb032f]
***エイリアス一覧確認 [#wde61a9d]
 PS> Get-Alias
***コマンドレットに対応するエイリアスを確認 [#xa3be976]
 PS> Get-Alias -Definition コマンドレット名
***エイリアスの作成 [#t3cbb04c]
-基本
 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
***エイリアスの変更 [#j65b45ed]
-基本
 PS> Set-Alias -Name エイリアス名 -Value コマンド
-読み取り専用エイリアスの変更
 PS> Set-Alias -Name エイリアス名 -Value コマンド -Force
-定数エイリアスの変更はForceオプションを使ってもできない。(削除も不可)
***エイリアスの削除 [#q3e9d948]
 PS> Remove-Item Alias:/エイリアス名
-Constantオプションを付加して作成された定数エイリアスは、Forceオプションを使っても削除できない。

**日付 [#z3f09627]
***今日の日付 [#yfe61fb3]
-日時(date)
 PS> Get-Date
-曜日など
 PS> (Get-Date).DayOfWeek    <- 他に、.Year .Month .Day .Hour .Minute .Second .DayOfYear など

***日付計算 [#yeff6b2a]
-今日から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

***日付のフォーマット(整形) [#oddee148]
-今日の日付を "2012/05/30" のように表示する (年:4桁、月日:2桁)
 PS> (Get-Date).ToString("yyyy/MM/dd")
-今日の日時を "20120530141530" のように表示する (区切り記号なし、年:4桁、月日時分秒:2桁、時:24h)
 PS> (Get-Date).ToString("yyyyMMddHHmmss")
-参考URL(MSDNライブラリ) : http://msdn.microsoft.com/ja-jp/library/system.globalization.datetimeformatinfo%28VS.80%29.aspx

**PSDrive作成(Windows Power Shell専用マウントポイントなので、NET USEでは出てこない) [#u7b2d441]
 PS> New-PSDrive -Name P -PSProvider FileSystem -Root C:\Tool
 PS> Set-Location P:
 PS> Get-Location
 C:\Tool
**PSDrive確認 [#w13337dd]
 PS> Get-PSDrive
-ファイルシステムのみ確認
 PS> Get-PSDrive -PSProvider FileSystem
-レジストリのみ確認
 PS> Get-PSDrive -PSProvider Registry
**システムの復元 [#ufc7d459]
***システム復元の有効化・無効化 [#we43540a]
 PS> Enable-ComputerRestore -Drive "C:\"           <- Cドライブのシステム復元有効化
 PS> Disable-ComputerRestore -Drive "C:\","D:\"    <- CドライブとDドライブのシステム復元無効化
***復元ポイントの作成 [#c3610cdc]
 PS> Checkpoint-Computer -Description "point1" -RestorePointType MODIFY_SETTINGS
|RestorePointType|>|>|h
|APPLICATION_INSTALL|APPLICATION_UNINSTALL|DEVICE_DRIVER_INSTALL|
|MODIFY_SETTINGS|CANCELLED_OPERATION||
**アカウント [#b58adb16]
***アカウントの状態確認 [#x33c1211]
 PS> Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount=True and Name='Guest'" | Select-Object Name, Status
***ロック解除 [#v37bdd7f]
**COMオブジェクト [#c0962652]
***Excelオブジェクトの作成 [#h96a2455]
 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への接続 [#q9fe02f8]
 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()
**タスクスケジューラ [#kbb670b1]
***タスクの実行 [#w2d6ff87]
 PS> $A = New-Object -ComObject Schedule.Service
 PS> $A.Connect()
 PS> $A.GetFolder(フォルダパス).GetTask(タスク名).Run
 
 例.手動デフラグのタスクを実行する
 PS> $A.GetFolder("\Microsoft\Windows\Defrag").GetTask("ManualDefrag").Run
**エラー応答 [#ua3e358f]
***エラーを無視する。 [#r9501a11]
 PS> Get-ChildItem HKLM: -ErrorAction "SilentlyContinue"
-Get-ChildItemは一例。-ErrorActionは共通パラメータなので、どのコマンドレットでも使用可能。
-コマンドが強制終了しないレベル(警告レベル)のものに限り有効。強制終了してしまう程のエラーには対処できない。
***エラー(例外)をトラップする [#k4f73e38]
 PS> Trap {"exception trapped."; continue}
 PS> Trap [System.Exception]{"exception trapped."; continue}
-通常のコマンドラインでも利用できるが、スクリプトで利用することが多い。(スクリプト内での利用の方が幅広く使える)
-トラップ後の対応には、"continue"以外に"break"などもある。
**出力 [#k4e69f2b]
***文字出力(echo) [#m771c42b]
 PS> Write-Host "foo"
 foo
 
 $a = "bar"
 PS> Write-Host $a
 bar
***ページ送り出力(more) [#a2bdf81c]
 PS> 画面出力を返すコマンド | more
 PS> 画面出力を返すコマンド | Out-Host -Paging
 PS> Out-Host -InputObject 画面出力を返すコマンド -Paging
-moreの方が余計なものを出力しないので使いやすいが、コマンドレットして渡したいならOut-Hostで。
***文字の色を変更する [#fadc6d2d]
 PS> Write-Host -ForegroundColor red
-使用できる色は[[http://technet.microsoft.com/ja-jp/library/ee177031.aspx]]を参照
***文字の背景色を変更する [#pb74950e]
 PS> Write-Host -BackgroundColor green
-使用できる色は[[http://technet.microsoft.com/ja-jp/library/ee177031.aspx]]を参照
----
**ちょっとした応用(上:省略形、下:基本形) [#q7176066]
***ls -lhSr [#t2d8f9f2]
 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 [#be8134b3]
 PS> (ls -recurse | measure length -sum).sum
 PS> (Get-ChildItem -Recurse | Measure-Object -Property Length -Sum).Sum
***2GBを超えたファイルを削除する [#h9f1b49b]
 PS> ls | ? {$_.length -gt 2GB} | % {rm $_.fullname}
 PS> Get-ChildItem | Where-Object {$_.Length -gt 2GB} | ForEach-Object {$_.FullName}
**本当の意味でのTips [#n5203125]
***foreachとForEach-Objectでは、foreachのほうが速い [#o89fd389]
-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は、ほぼ同じ速さ [#jf255a6c]
-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