2016年11月10日木曜日

◆自分が所属するグループをリストする

Getting List of Current Group Memberships - Power Tips - PowerTips - IDERA Community

#requires -Version 3.0
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value

上記で自分が所属するグループのSIDが表示される
image_thumb[1] 

名称変換も加えたのが以下

#requires -Version 3.0
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups.Translate( [System.Security.Principal.NTAccount])

image

ActiveDirectoryのモジュールは不要。
「CONSOLE LOGON」のような動的?なグループも含めてすべて表示されるようだ。

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年8月31日水曜日

◆ストアアプリの削除方法

ストアアプリはプログラムの追加と削除からではなくPowerShellでやる必要があるのだとか。(GUIを提供しないのは手抜き?)

http://answers.microsoft.com/ja-jp/windows/wiki/apps_windows_10-outlook_mail/windows-10/239ef7e9-9f4f-40dc-bf41-2cd2b8217843

2016年8月26日金曜日

◆PowerShellでWebサイトをホストする

http://powershell.com/cs/blogs/tips/archive/2016/08/11/creating-powershell-web-server.aspx

IISとか無しにWebサイトをPowerShellだけでホストしちゃいましょって感じ。

このサンプルを実行しておいて、http://localhost:8080/ にアクセスすると「Here is PowerShell」という文字を表示、http://localhost:8080/services にアクセスするとGet-Serviceした内容を返すというもの。
http://localhost:8080/hoge といった存在しないアドレスにアクセスすると404を返してサービス終了といった仕様になっているようだ。

こんなに簡単にできちゃうんですね。

2016年8月23日火曜日

◆ExplorerのパスをカレントにしてPowerShellを開く

ExplorerのアドレスバーにPowerShellと打ってEnterを押すと、そこをカレントにしてPowerShellウインドウが開く。
http://powershell.com/cs/blogs/tips/archive/2016/08/09/opening-powershell-for-folder.aspx

image

image

image

本当にTipsって感じ。

2016年7月20日水曜日

◆Windows10でのWindowsUpdateのログ

いつも苦労するWindowsUpdate

Windows10ではPowerShellコマンドを使わないとログが見れないのだとか。
http://www.atmarkit.co.jp/ait/articles/1607/15/news035_4.html

また、ログに吐かれたIDをWebから検索して詳細を表示する仕掛けらしいのだが、見つからないIDが結構ある。(UnKnownで表示される)

UnKnownは邪魔なのでスキップして表示するようにしてみた。

001
002
003
004
005
006
007
008
009
010
011
012
013
014

filter grep
{
 
param
(
 
$keyword,
  [switch]$notmatch
)
 
$_ | Out-String -Stream |
 
      
Select-String -Pattern $keyword -NotMatch:$notmatch
 
}


$logPath = "D:\desktop\WindowsUpdate.log"
Get-WindowsUpdateLog -LogPath $logPath
(Get-Content $logPath |
 
   
grep -keyword "Unknown" -notmatch)  | Out-File $logPath

結果は以下のような感じ。
image

2016年6月8日水曜日

◆バージョンをソートする

strip off data from variable

Win32_Product から .NET Frameworkのバージョンを調べたい。
複数のバージョン戻り値から最新を取り出すにはどうすれば良いですかね・・・。

といった感じの質問だろうか。

バージョンが文字列で返ってきているのでどうやってソートしましょうか。

以前、以下のサンプルで使ったVersionクラスにキャストすると良さそう。
◆IPアドレスをソートする

PowerShell的にはそれだけのお話。

ちょっと気になるのが、.NET Frameworkのバージョンを調べるのに本当にWin32_Productで良いのだろうか。

以下にかなりの力作があるので実行してみたところ、若干(だいぶ?)異なる。
.NET Frameworkのバージョンを確認する方法

以前以下の様な例も見たことがあるが、これもちょっと違う。

PS> dir  $env:windir\microsoft.net\framework\v* –name

それではと、VisualStudioを立ち上げてみたが結局どれとも異なる。

まぁ、いいか。(笑)

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

2016年4月26日火曜日

PowerShellでTail

ログを監視するときなどに便利なtail(ファイルの最後を読み取る)。

前から出来ていたような気がしましたが3.0からなんですね。

>Get-Content  hoge.log –Wait  -Tail 0

Tailing Log Files - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

2016年3月17日木曜日

◆配列操作を速く行う

PowerShellで行う処理にシビアな速度を要求されることは多くないので、私は、PowerShellの処理速度をあまり気にしていない。

今回の話は、単純な配列を使うより「ArrayList」を使うと早いよってお話。
確かに速度は圧倒的に違うようだ。
Faster Array Manipulations - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

それでも1万回ループでの話なのでそれほど気にする局面は無いかも。
まぁ、覚えておいて損はない。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015

# SLOW
Measure-Command {
  $ar = @()
  for ($x = 1; $x -lt 10000; $x += 1) {
    $ar += $x
  }
}


# FAST
Measure-Command {
  [System.Collections.ArrayList]$ar = @()
  for ($x = 1; $x -lt 10000; $x += 1) {
    $null = $ar.Add($x)
  }
}

2016年3月15日火曜日

◆バージョンを比較する

Compare Versions - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

以前もほぼおなじ内容のTipsが出ていた。
Comparing Versions - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

特に大した話ではなく、Versionは文字列なので単純に比較すると意図した結果にならない。そこで、.NETのVersionクラスに変換して比較すると良いよってお話。

その時に、式の左側だけにキャスト指定をすれば、右側はPowerShellが自動的に合わせてくれる。(PowerShellは通常そういう動作をしたような気がする)

>[System.Version] '3.4.22.12' -gt '22.1.4.34'

2016年3月9日水曜日

◆Set-WinUserLanguageList(3.0)

キーボードレイアウトを設定する

英語キーボードにするにはこんな感じ。

>Set-WinUserLanguageList -LanguageList en-us

設定はリアルタイムにコンピュータ全体に適用される。
このままだと確認メッセージが表示されるが、Forceオプションを付ければ確認を回避できる。

2016年3月8日火曜日

◆違うオブジェクトを混ぜるな

Do Not Mix Different Objects!

以前、◆コンソール出力のオブジェクトマージ機能を回避するでちょっと書いたことがあるオブジェクト出力の話。

異なるオブジェクトを一緒にコンソール出力するとマージされて表示される。(共通の見出し項目で表示される)
その際、先に出現したオブジェクトのプロパティが優先して見出し項目に採用されるので、あとから来たオブジェクトの固有のプロパティは表示されなくなってしまう。

回避するにはそれぞれに「Out-Host」を挟むと良いってお話。

2016年2月12日金曜日

◆メモ帳に処理結果を出力する

PowerShellの結果を何処かにテキストファイルとして保存して、それをメモ帳で開く。
なんてのは以前やったことがあるが、これは未保存のテキストデータを直接メモ帳で表示しようというもの。

WindowsAPIを使って本格的にやっている。

プロファイルに入れておくと便利なこともあるかなぁ。

Send Text to Notepad

2016年2月8日月曜日

◆フォルダ配下のソースファイルを対象に文字列置換(パイプラインは難しい)

大体判ったつもりでいるパイプラインだが、今回はちょっとハマった。

以下の処理はあるフォルダに有るソースファイルを対象に、まとめて文字列置換しようと言うもの。
今回はファイル名に対しても同じ置換を行っている。

大したことはない処理なのだが、なぜか思い通りの結果にならない。

001
002
003
004
005
006
007
008
009
010
011
012
013

Param(
 
$path,
  $BeforeString,
  $AfterString
)

dir $path -File *.cs | %
{
 
$tString = gc $_.
FullName 
 
Move-Item $_.FullName ($_.FullName + ".old"
)
 
$newName = $_.Name -replace $BeforeString,$AfterString
  $newPath = Join-Path $_.DirectoryName $newName
  $tString -replace $BeforeString,$AfterString | Set-Content $newPath
}

変換前
image

変換後
image

“HenoUmu”を”KeizokKbn”に変換しているのだが、なぜか変換後のファイルが再び変換対象に含まれている。
先頭の1個だけ。

不思議というか、きっとみんなハマりますよね・・・。

とりあえず、カッコを付けて、(dir $path –File *.cs)  |  ~
とやるんですかね。

2016年2月7日日曜日

◆Windows10でスリープ

以前作ったスクリプトのスリープがうまくいかなくなってしまった。

復帰に失敗するのだ。
マウスクリックにより復帰し始めてHDとかにアクセスしにはいくのだが画面が黒いままだんまり。

Windows7からWindows10にアップグレードしてからも問題なく動いていたが、どうも先日のWindowsUpdateが宜しくなかったようだ。

試しに、スクリプトでは無くメニューからスリープすると問題ないので、このスクリプトからのスリープはメニューからのスリープと全く同等の物ではないのだろう。

マザーボードの最新ドライバーとかを入れると直るのかもしれないが、現象からすると微妙な感じ。

メニューと全く同等のスクリプトが組めれば良いだけなのだが、なんとも・・・・。

電源周りはどうしてもハードとの相性が出てくるので昔から混沌としてあまり関わりたくない。

ちょっとだけ調べたので一応メモだけしておく。

我らが牟田口さんが紹介していた方法。
rundll32.exe powrprof.dll,SetSuspendStateを使う方法

こいつはPCの休止状態が有効の場合は休止してしまうようだ。
休止を無効にするのはここらへんが参考になりそうだが、特に使いはしないのだが貧乏性なので無効にしてしまうのはちょっともったいない気がする。

ここでちょっと脱線すると、そもそも休止状態って有効になっているっぽいんだけどどこから使うの?と疑問に思う。メニューとかには見当たらない。
電源設定とかを見渡しても良く判らない・・・。
というか、この電源設定メニューってカオスすぎ。
どうするとここまでいい加減なメニュー体系になるのかなぁ・・・。

とりあえず以下を参考にすれば使えるようになりそう。
スタートメニューの電源オプションに休止状態を表示する方法

というわけで、どんどん深みにはまっていきそうなので、さしあたってショートカットとかがないのか探してみる。(画面をロックする時のWin+Lみたいなやつ)

一発で出来る奴は見当たらなかったので、さしあたって、
「Windowsキー + Xキー」 ⇒ 「Uキー」 ⇒ 「Sキー」

って感じだろうか。

また、電源周りの説明は以下に結構詳しくまとまっている。
Windows をコマンドラインやショートカットからお手軽にスリープさせる方法

ここで紹介しているSysinternalsとかを使うのが一番スマートなのかもしれない。
(が、標準装備じゃないのがちょっと残念)

---

その後使っているとやっぱり復帰失敗が度々発生。
いくら調べてもこれといった解決策は見つからず・・・。
必ず失敗するわけでは無いことから、致命的な問題では無いと思われる。
微妙なタイミング的問題か・・・。

ここでふと、先日会社のPCの調子が悪くなって思いあぐねていたところ、メモリーの挿し直しで解決したことを思い出した。

思いつきでUSB機器(といってもキーボードとマウスだけだが)を挿し直す。
(ドライバーが自動で再インストールされる)

なんと、見事に解決。\(^o^)/
1ヶ月ほど経ったが失敗は無し。

2016年2月2日火曜日

◆PowerShell のバージョンと対応OS

Windows10に搭載されたPowerShellのバージョンが5.0となった。
Windows7時代の2.0から比較的速いペースで上がってきたために自宅や会社で接するPowerShellのバージョンが混沌としている。

表記の資料がWikipediaに纏まっていたのでコピペしておく。

PowerShell のバージョンと対応OS
項目 1.0 2.0 3.0 4.0 5.0
Windows Server 2003 ○SP1 ○SP2 × × ×
Windows Server 2003 R2 ○SP1 ○SP2 × × ×
Windows Server 2008 ○SP1 ○SP2 × ×
Windows Server 2008 R2 ○SP1 ○SP1 ○SP1
Windows Server 2012
Windows Server 2012 R2
Windows XP x64 × × × ×
Windows XP ○SP2 ○SP3 × × ×
Windows Vista ○SP1 × × ×
Windows 7 ○SP1 ○SP1 ○SP1
Windows 8 × ×
Windows 8.1
Windows 10

「◎」標準搭載、「○」インストールして利用可能、「→」上位バージョン標準搭載、「×」利用不可

2016年2月1日月曜日

◆Start-MpScan

Quickly Scanning for Malware

Defender用のコマンド(Function)が提供されているそうな。Version3かVersion4あたりからでしょうか。

PS> Start-MpScan -ScanType QuickScan -ScanPath “C:”

なぜか私のWindows8.1環境ではエラーになった。(Windows10ではOK)
image

調べてみたが、ほとんど事例がなかったので私のPC環境がどこかおかしそうな気がする。

2016年1月18日月曜日

◆Pingを並列に行う

以前Test-Connectionを使う方法を書いたことがあるが、こちらは並列処理。

速さを求める場合はこちらが有利だろう。
http://powershell.com/cs/blogs/tips/archive/2016/01/15/pinging-multiple-systems-fast.aspx

簡単に書くと以下の様な感じで「Win32_PingStatus」使う。

001
002
003
004
005

$filter = 'Address="Hoge-PC1" and Timeout=2000 or
           Address="Hoge-PC2" and Timeout=2000 or
           Address="Hoge-PC3" and Timeout=2000'

Get-WmiObject Win32_PingStatus -Filter $filter |
Select-Object Address,ProtocolAddress,ResponseTime,Timeout

2016年1月13日水曜日

◆Open Live Writer を使ってみる(番外編)

私はこのブログを書くのに「Windows Live Writer」と「Blogger」を使ってきたのだが、最近「Windows Live Writer」から「Blogger」への接続がエラーになるように成ってしまった。

どうも、「Blogger」側(Google)がセキュリティー強化のため認証方法を変更したっぽい。
「Windows Liver Writer」は良いソフトなのだが、MSのWindows Live戦略の頓挫(方針変更?)によりここ数年アップデートされたことは無い。(多分今後も無いだろう)

最近ブログを書くペースも落ちてきているので、まぁいいか・・・、と思っていたところ、運良く「Windows Live Writer 」がオープンソース化されて「Open Live Writer」となったとの情報を見つけた。

リリース当初は「Blogger」に対応できていなかったようだが、最新版では問題なく接続できた(英語版ですが)
日本語での投稿自体は問題ないようなので、しばらく使ってみようと思う。(プラグインはまだ対応していないようだが、オープンソースなので近いうちに対応してくるのではなかろうか・・・)

あら、カテゴリーが設定できない・・・。

---

その後使っていると、やっぱりプラグインが使えないのが微妙に痛い。
そこで、当面の暫定策として「Windows Live Writer」も一緒に立ち上げ、編集はそちらで行い、HTMLソースをコピペで「Open Live Writer」に持ってきて投稿だけをこちらで行うことにした。

あら、カテゴリーが設定できるぞ・・・。

----
2016/10/28追記

久しぶりに使ってみたら過去記事の一覧取得でエラーになる。(><)
(新規作成はできそう)

バージョンアップ版が無いかサイトを見てみたがバージョン表記が無いので良く判らない(メジャーバージョンしかわからない)

仕方がないのでダウンロードして実行してみる。
あら、エラー・・・。
まぁいいや諦めて旧バージョンを実行、っと思ったらエラー(><)
リンク先が無くなっている。消されちゃった?

仕方が無いのでダメもとで再度先ほどのセットアップファイルを実行してみる。

すると、Open Live Writerが起動する。(@@)

あれ、インストーラーじゃなくて実行ファイルそのものだったの???

もしくは最近のOfficeとかで使われている「クイック実行形式」???

最近の世の中にはついていけないな(笑)