ラベル コマンドレット の投稿を表示しています。 すべての投稿を表示
ラベル コマンドレット の投稿を表示しています。 すべての投稿を表示

2021年11月19日金曜日

◆Out-GridViewの表示途中に画面を閉じると

Out-GridViewにデータをパイプしている最中(時間が掛かっている時)にGridの画面を閉じてしまうと(時間が掛かるからやーめたってパターン)Powershellが落ちてしまうようです。

以下と見るとBUGのようなので余り対策は無さげですが、

https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/dealing-with-out-gridview-bug

パイプするデータを予め変数に入れてから繋ぐか、メッセージを出してパイプが終わるまで待ってもらう感じですかね。

2020年10月22日木曜日

◆Get-ADUser フィルター(filter)の指定方法

外側をダブルコーテーション、文字列をシングルコーテーションで囲むのが基本でしょうか。

外側囲み記号

属性

値の指定方法

値の囲み記号

結果

シングルコーテーション

数値

コンスタント

無し

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

2016年11月7日月曜日

◆IPアドレスのロケーションを表示

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

image

Restが簡単に使えますってサンプルかな。
個人的には、ロケーションを調べることは無いと思うがこのメソッドは覚えておきたい。

あと、以前はExpandPropertyとPropertyは共存できなかったと記憶しているが、できるようになってるんですね。

3.0から?

◆DHCPで設定されたアドレスを取得する

>Get-NetIPAddress | ? PrefixOrigin –eq DHCP | % IPAddress

2016年10月28日金曜日

◆スタート画面のカスタマイズ

スタート画面のタイルをエクスポート、インポートできるらしい。

>Export-StartLayout -Path ファイルパス
>Import-StartLayout -LayoutPath ファイルパス -MountPath C:¥

ただし反映されるのは、この処理を行った後に追加したユーザーとの事なので、バックアップとかの用途ではなく、初期展開などの用途でしょうか。

2016年4月27日水曜日

◆長いファイル名を扱う

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を用意しておく必要があるのだと。
ただ、これも自動的にダウンロードしてくれるようなので成り行きに任せておけばなんとかなる。

image

2015年8月18日火曜日

◆2つの配列の差(和、積)を取る

$a1 = 1..10
$a2 = 2,4,80,98

"<差>"
compare  $a1  $a2  |  %  inputobject  |  sort

"<和>"
$a1 + $a2  |  sort -Unique

"<和>"
compare  $a1  $a2 –IncludeEqual  |  %  inputobject  | sort

"<積>"
compare  $a1  $a2 -IncludeEqual –ExcludeDifferent  | %  inputobject  | sort

image

2015年7月29日水曜日

◆Zipファイルを解凍する

Windows10が今日からダウンロード可能になるそうな。

私的にはもう少し様子を見てからと思っていますが、無償アップグレードということなので、かなりのPCがWindows10に変わっていくことが予想されます。

Windows8の評判がすこぶる悪かったため、PowerShellも2.0の使用を基本に考えてきましたが、これからはWindows10に搭載される5.0を前提にしようかと考えています。
(クライアントで動かすようなスクリプトは)

 

5.0ではZipの解凍も標準コマンド(Function)でできるようです。

Expand-Archive  -Path  Zipファイルのパス  -Dest  解凍先フォルダーのパス

当然、圧縮も「Compress-Archive」が用意されています。

これまで圧縮はちょっと面倒だったので、これだけでもすごく嬉しい・・・。

2015年4月16日木曜日

◆Gourp-Object からのHashTable

ちょっと躓いたのでメモ。

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をつければうまくいくことは判っているが、なぜ違いが出るのだろう・・・。

あとで調査。

2015年4月2日木曜日

◆High Impact のコマンドレットを探す

Discovering High Impact Cmdlets - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

上記の記事で、High Impactのコマンドレットを探すスクリプトが紹介されている。
(High Impact  とは、確認ダイアログが表示されるコマンド?)
image

改行とかを若干調整して以下にメモしておく。

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

結果はこんな感じ。
image

ただし、Set-ExecutionPolicyなどはHighにならないので、単純に確認ダイアログが出るかどうかでもないのか・・・。

2014年12月16日火曜日

◆HotFix(Windows Update)の適用確認

この間の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'"

2014年11月28日金曜日

◆検索文字列の前後の行を表示する2

以下で表示したサンプルを最近見直したところ非常に見づらい。
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

image

2014年10月29日水曜日

◆「Format-List *」をプロパティ順に表示する

以下のプロパティをPS3.0で表示する。

image

image

できればプロパティの名前順に表示したい。

Format-Listは基本的にパイプラインの最後なので簡単にソートすることは出来ない。

とりあえず以下のような感じだろうか。

>(Get-NetAdapter イーサーネット1 | tee -var net) | fl -Prop ($net | gm | sort name).name

2014年8月26日火曜日

◆検索文字列をハイライト表示する

環境変数に目的のパスが含まれているか確認したいことは良くあるが、結構なが~いのが普通なので年寄が目視で確認するのはちと辛い。

メモ帳に貼り付けて検索すれば事足りるのだが、やっぱりここは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

結果

image

2014年8月22日金曜日

◆Measure-Objectで日付型のMAXは取得できない

WindowsUpadateの最終更新日を取得する。

Get-HotFix | Measure -Maximum -Property InstalledOn

てな感じで取得できそうな気がする。(実際、Windows8では取得できる)

しかし、Windows7では以下のようなエラーが・・・。

image

えぇー、数値しか駄目なの(><)

仕方がないので力技(一旦数値に変換してから戻す)

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がまだまだ幅を利かせてしまうので、ちょっと悩ましい。

2013年9月26日木曜日

◆Invoke-WebRequestサンプル2

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

<切り出し前>

image

<切り出し後>

image