Out-GridViewにデータをパイプしている最中(時間が掛かっている時)にGridの画面を閉じてしまうと(時間が掛かるからやーめたってパターン)Powershellが落ちてしまうようです。
以下と見るとBUGのようなので余り対策は無さげですが、
パイプするデータを予め変数に入れてから繋ぐか、メッセージを出してパイプが終わるまで待ってもらう感じですかね。
Out-GridViewにデータをパイプしている最中(時間が掛かっている時)にGridの画面を閉じてしまうと(時間が掛かるからやーめたってパターン)Powershellが落ちてしまうようです。
以下と見るとBUGのようなので余り対策は無さげですが、
パイプするデータを予め変数に入れてから繋ぐか、メッセージを出してパイプが終わるまで待ってもらう感じですかね。
外側をダブルコーテーション、文字列をシングルコーテーションで囲むのが基本でしょうか。
|
外側囲み記号 |
属性 |
値の指定方法 |
値の囲み記号 |
例 |
結果 |
|
シングルコーテーション |
数値 |
コンスタント |
無し |
Get-ADUser -Filter 'employeeid -eq 479' |
〇 |
|
シングルコーテーション |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter 'employeeid -eq $id' |
〇 |
|
シングルコーテーション |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter 'employeeid -eq $($p.id)' |
X |
|
シングルコーテーション |
文字列 |
コンスタント |
ダブルコーテーション |
Get-ADUser -Filter 'samaccountname -eq "hoge_hoge"' |
〇 |
|
シングルコーテーション |
文字列 |
変数 |
無し |
$account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq $account' |
〇 |
|
シングルコーテーション |
文字列 |
変数 |
ダブルコーテーション |
$account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq "$account" ' |
X |
|
シングルコーテーション |
文字列 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq $($p.account)' |
X |
|
ダブルコーテーション |
数値 |
コンスタント |
無し |
Get-ADUser -Filter "employeeid -eq 479" |
〇 |
|
ダブルコーテーション |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter "employeeid -eq $id" |
〇 |
|
ダブルコーテーション |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "employeeid -eq $($p.id)" |
〇 |
|
ダブルコーテーション |
文字列 |
コンスタント |
シングルコーテーション |
Get-ADUser -Filter "samaccountname -eq 'hoge_hoge' " |
〇 |
|
ダブルコーテーション |
文字列 |
変数 |
無し |
$account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq $account" |
X |
|
ダブルコーテーション |
文字列 |
変数 |
シングルコーテーション |
$account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq '$account' " |
〇 |
|
ダブルコーテーション |
文字列 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq $($p.account)" |
X |
|
ダブルコーテーション |
文字列 |
変数(プロパティ) |
シングルコーテーション |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq '$($p.account)' " |
〇 |
|
波括弧 |
数値 |
コンスタント |
無し |
Get-ADUser -Filter {employeeid -eq 479} |
〇 |
|
波括弧 |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter {employeeid -eq $id} |
〇 |
|
波括弧 |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter {employeeid -eq $($p.id)} |
X |
http://community.idera.com/powershell/powertips/b/tips/posts/finding-location-of-ip-address
| 001 002 003 004 005 006 007 008 009 010 | #requires -Version 3.0 function Get-IPLocation([Parameter(Mandatory)]$IPAddress) { $geoip = "http://geoip.nekudo.com/api/$IPAddress" Invoke-RestMethod -Method Get -Uri $geoip | Select-Object -ExpandProperty Country -Property City, IP, Location } Get-IPLocation -IPAddress 8.8.8.8 |
Restが簡単に使えますってサンプルかな。
個人的には、ロケーションを調べることは無いと思うがこのメソッドは覚えておきたい。
あと、以前はExpandPropertyとPropertyは共存できなかったと記憶しているが、できるようになってるんですね。
3.0から?
スタート画面のタイルをエクスポート、インポートできるらしい。
| >Export-StartLayout -Path ファイルパス |
ただし反映されるのは、この処理を行った後に追加したユーザーとの事なので、バックアップとかの用途ではなく、初期展開などの用途でしょうか。
http://powershell.com/cs/blogs/tips/archive/2016/04/14/dealing-with-long-file-names.aspx
フォルダー階層が深くなりすぎるとファイルの参照が出来なかったりする。
PSAlphaFSというモジュールを使うと長いパスに対応したコマンドレットを提供してくれるそうな。
PS> Install-Module -Name PSAlphaFS -Scope CurrentUser PS> Get-Command -Module PSAlphaFS | Select-Object Name, Version Name Version ---- ------- Copy-LongItem 1.0.0.0 Get-LongChildItem 1.0.0.0 Get-LongItem 1.0.0.0 Move-LongItem 1.0.0.0 New-LongItem 1.0.0.0 Remove-LongItem 1.0.0.0 Rename-LongItem 1.0.0.0 |
バージョンは5.0からですかね。(Install-Moduleが5から、PSAlphaFS自体がどうかは?)
モジュールは予め用意しなくても、勝手にダウンロードしてくる。
ただし、最初にNuGetを用意しておく必要があるのだと。
ただ、これも自動的にダウンロードしてくれるようなので成り行きに任せておけばなんとかなる。
| $a1 = 1..10 "<差>" "<和>" "<和>" "<積>" |
Windows10が今日からダウンロード可能になるそうな。
私的にはもう少し様子を見てからと思っていますが、無償アップグレードということなので、かなりのPCがWindows10に変わっていくことが予想されます。
Windows8の評判がすこぶる悪かったため、PowerShellも2.0の使用を基本に考えてきましたが、これからはWindows10に搭載される5.0を前提にしようかと考えています。
(クライアントで動かすようなスクリプトは)
5.0ではZipの解凍も標準コマンド(Function)でできるようです。
Expand-Archive -Path Zipファイルのパス -Dest 解凍先フォルダーのパス
当然、圧縮も「Compress-Archive」が用意されています。
これまで圧縮はちょっと面倒だったので、これだけでもすごく嬉しい・・・。
ちょっと躓いたのでメモ。
| 001 002 003 004 005 006 007 | $HashService = Get-WmiObject Win32_Service | Group-Object State -AsHashTable $HashService.Stopped "◆◆◆◆" $HashService2 = Get-Service | Group-Object Status -AsHashTable $HashService2.Stopped |
$HashService.Stoppedは参照できるが、$HashService2.Stoppedの方は参照できない。
AsStringをつければうまくいくことは判っているが、なぜ違いが出るのだろう・・・。
あとで調査。
上記の記事で、High Impactのコマンドレットを探すスクリプトが紹介されている。
(High Impact とは、確認ダイアログが表示されるコマンド?)
改行とかを若干調整して以下にメモしておく。
| 001 002 003 004 005 006 007 008 009 010 011 012 | Get-Command -CommandType Cmdlet | % { $type = $_.ImplementingType if ($type) { $type.GetCustomAttributes($true) | ? { $_.VerbName } | Select @{ Name='Name' Expression={'{0}-{1}' -f $_.VerbName, $_.NounName} },ConfirmImpact } } | Sort ConfirmImpact -Descending |
ただし、Set-ExecutionPolicyなどはHighにならないので、単純に確認ダイアログが出るかどうかでもないのか・・・。
この間のWindowsUpadateは規模も大きかったせいか幾つか不具合が出ているようだ。
自分のPCに適用されているか確認するにはコントロールパネルの「プログラムと機能」から目視で確認できるが、探すのがちょっと大変。
PowerShellでは「Get-HotFix」というそのものずばりのコマンドが用意されているので簡単に確認できる。
| PS>Get-HotFix "KB3004394","KB3002339","KB3011970","KB2553154" |
権限があってFireWallが通れば一括での確認もできそう。
| PS>"sv1","sv2" | %{Get-HotFix "kb982018","KB976932" -comp $_} |
特に意味は無いが、WMIクエリーでもやってみたので一応メモしておく。
| PS>gwmi -Query "select * from win32_quickfixengineering where hotfixid='KB982018'or hotfix id='KB976932'" |
以下で表示したサンプルを最近見直したところ非常に見づらい。
PowerShell: ◆検索文字列の前後の行を表示する(Select-String)
マッチした塊ごとに区切りが欲しいところ。
Select-Stringの機能自体では難しそうなので、区切りを追加するロジックを入れてみた。
| 001 002 003 004 005 006 007 008 009 010 | filter SelStrDlim{ $_.context.precontext ">" + $_.line $_.context.postcontext "-" * 10 } Get-Help Get-ChildItem -Full | Out-String -Stream | Select-String パイプライン -Context 7,1 | SelStrDlim |
以下のプロパティをPS3.0で表示する。
できればプロパティの名前順に表示したい。
Format-Listは基本的にパイプラインの最後なので簡単にソートすることは出来ない。
とりあえず以下のような感じだろうか。
| >(Get-NetAdapter イーサーネット1 | tee -var net) | fl -Prop ($net | gm | sort name).name |
環境変数に目的のパスが含まれているか確認したいことは良くあるが、結構なが~いのが普通なので年寄が目視で確認するのはちと辛い。
メモ帳に貼り付けて検索すれば事足りるのだが、やっぱりここはPowerShellでやってみたい。
幸いファイル群から文字列を検索してハイライト表示するスクリプトが以下で公開されていた。
Wes' Puzzling Blog - Powershell script to find strings and highlight them in the output
(通常はこちらのほうが使いでがあると思われる。)
とりあえずこれをそのまま利用させていただいて単純な文字列からのパターン検索に変更した。
やっつけで変更したので中身はほとんど理解していない・・・。
| 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 | function Write-HostAndHighlightPattern( [string] $pattern = "" , [string] $inputtext = "" , [switch] $caseSensitive = $false ) { if ($pattern -eq $null -or $pattern -eq "") { Write-Error "Please provide a search pattern!" ; return } $regexPattern = $pattern if($caseSensitive -eq $false) { $regexPattern = "(?i)$regexPattern" } $regex = New-Object System.Text.RegularExpressions.Regex $regexPattern $index = 0 while($index -lt $inputText.Length) { $match = $regex.Match($inputText, $index) if($match.Success -and $match.Length -gt 0) { Write-Host $inputText.SubString( $index, $match.Index - $index) -nonewline Write-Host $match.Value.ToString() -Foreground Red -nonewline $index = $match.Index + $match.Length } else { Write-Host $inputText.SubString($index) -nonewline $index = $inputText.Length } } } Write-HostAndHighlightPattern "system32" $env:path |
結果
WindowsUpadateの最終更新日を取得する。
| Get-HotFix | Measure -Maximum -Property InstalledOn |
てな感じで取得できそうな気がする。(実際、Windows8では取得できる)
しかし、Windows7では以下のようなエラーが・・・。
えぇー、数値しか駄目なの(><)
仕方がないので力技(一旦数値に変換してから戻す)
| PS>[datetime][long]((Get-HotFix | select {($_.installedon).ticks} | measure -Maximum -Property '($_.installedon).ticks').Maximum) |
まだ、以下のほうが良いか
| PS>(Get-HotFix | sort installedon -Des | select -First 1).InstalledOn |
ちゃんとやっている方もいらっしゃる
Measure-Latest: finding latest date/time | Dmitry's Blog: Cloud, PowerShell and beyond
Windows8が大コケしたおかげで、PowerShellも2.0がまだまだ幅を利かせてしまうので、ちょっと悩ましい。
PowerShell: ◆Invoke-WebRequestサンプル
Invoke-WebRequestで取ってきた後、ParsedHtmlプロパティを使うと自分でHTML解析せずに色々と使えそう。
私自身Web系のプログラミングはやらないので詳しくは判らないが、さしあたってタグとその順番を指定して切り出すには以下のような感じ。
| 001 002 003 004 005 006 007 008 009 | $URL = "http://weather.yahoo.co.jp/weather/jp/3/3310.html" $OutputFile = "$env:temp\weather.html" $data = Invoke-WebRequest -Uri $URL @($data.ParsedHtml.getElementsByTagName("h2"))[0].OuterHTML , @($data.ParsedHtml.getElementsByTagName("table"))[0].OuterHTML | Set-Content -Path $OutputFile & $OutputFile |
<切り出し前>
<切り出し後>