2014年7月4日金曜日

◆拡張子毎にファイルをフォルダに振り分ける

  PowerShellの紹介とかサンプルでよく出てきそうなやつ。

以下のようなごちゃごちゃのファイルを拡張子毎にフォルダを作って振り分けてコピーする。

image

001
002
003
004
005
006

$outDir = "d:\Desktop\out1"
dir "d:\Desktop\imp1" | group extension | %
{
 
$outDirEx = Join-Path $outDir $_.Name.Substring(1
)
 
if(!(Test-Path $outDirEx)){mkdir $outDirEx
} 
 
$_.Group | %{copy $_.FullName $outDirEx }
}

結果

image

2014年7月1日火曜日

◆演算子を連結して実行する

PowerShellの演算子は連結して実行できたりする。

PS>"a,b,c,d,e" -split ','
a
b
c
d
e
PS>"a,b,c,d,e" -split ',' -notlike 'c'
a
b
d
e
PS>"a,b,c,d,e" -split ',' -notlike 'c'-replace 'b','{0}'
a
{0}
d
e
PS>"a,b,c,d,e" -split ',' -notlike 'c'-replace 'b','{0}'-join '-'
a-{0}-d-e
PS>("a,b,c,d,e" -split ',' -notlike 'c'-replace 'b','{0}'-join '-') -f 'bbb'
a-bbb-d-e

最後のフォーマット演算子(-f)はなぜか括弧が必要だった。
(優先順位が違うのだろうか)

2014年6月30日月曜日

◆Profileのスクリプト実行をバイパスする

Profileに記述したスクリプトを実行したくないときが稀にある。

そんなときは、起動パラメータを指定すると良い。

>PowerShell –NoProfile

頻繁に使う場合は、スクリプトの先頭に以下を追加しておく。

>Add-Type -AssemblyName PresentationFramework
>if([System.Windows.Input.Keyboard]::IsKeyDown('Ctrl')) { return }

Profile以外でも使えそうな機能なので覚えておくと良さそう。

ただし、この機能はSTAを要求するようなのでPowerShell3.0以降で使うのが良いかも。

2014年5月19日月曜日

◆メーラーを使ってメール送信

ウィルス対策ソフトによって「Send-MailMessage」がブロックされる場合、仕方が無いのでメールソフト経由で送信する。

もしかするとOUTLOOKあたりならCOMでも用意されているかも知れないが、今回はSendKeyを使った力技で。

こんなものでも使える局面はあるかもしれない。

001
002
003
004
005
006
007
008
009
010

add-type -AssemblyName System.Windows.Forms
$subject = 'メール送信のテストです'
$body = '本文です'
$to = 'minminnana@hoge.co.jp'
$mail = "mailto:$to&subject=$subject&body=$body"
Start-Process -FilePath $mail 
Start-Sleep -Seconds 2

#outlookの送信キー
[System.Windows.Forms.SendKeys]::SendWait("%S")

2014年5月2日金曜日

◆EFSでファイル暗号化

日々のPC利用において頭の痛いことの一つにパスワードの管理がある。
クラウドの普及に伴って、管理すべきパスワードの数は増加の一途。
大体は共通のパスワードを使いまわしたりするのだが、怪しげなサイトにも使ったりすると非常に危険。

私も以前、GmailのIDをのっとられた事があるので、それからは個別のパスワードを使用している。

ただし、当然いくつものパスワードを記憶できるわけも無く・・・。
結局メモする事になる。

素のまま置いておくのはさすがに気がひけるので暗号化を試してみる。

会社内とかの使用に限定するのであれば、OSの機能で暗号化するのが簡単だ。

暗号化したいファイルのプロパティから指定するだけ。
image

暗号化すると以下のように緑色で表示される。
image

ファイルサーバーに置いたファイルも、ドメイン内ならば暗号化したときと同じユーザーでログインすればどのクライアントからも使用できる。

PowerShellからも以下のように簡単に暗号化できる。

PS>(Get-Item  d:\Desktop\test.txt).Encrypt()

2014年4月30日水曜日

◆UNCパスをTest-Pathで確認する

Testing UNC Paths - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

Set-Location HKCU:\

とかやった後に、Test-Path \\Server\myfolder

とかでUNCパスを確認しようとするとうまくいかないってお話。

\\Server というレジストリーを探しに行っちゃうって事でしょうか。

コンテキストの影響を受けずに確認するには、

Test-Path  FileSystem::\\Server\myfolder

とやると良いとの事。

2014年4月22日火曜日

◆レジストリへのアクセス

レジストリへのアクセスは専用のプロバイダーが用意されていて、通常のファイルシステムのようにアクセスできる。
 特に難しいわけではないのでこれまでも適当に使ってきたが、それほど頻繁に使うわけでもないので、結局毎回試行錯誤しながら使うことになる。

そこで、いまさらの感はあるが使い方を自分用にメモしておく。

基本的には「Get-Item」と「Get-ItemProperty」を使ってアクセスする。(と思う)

以下のレジストリにアクセスしてみる。

image

Get-Item」で「TortoiseSVN」キーにアクセスするとこんな感じになる。

PS>Get-Item hkcu:software\TortoiseSVN


    Hive: HKEY_CURRENT_USER\software


SKC  VC Name                           Property
---  -- ----                           --------
  7  12 TortoiseSVN                    {SoundUtils KeyPath, TortoiseSVN,

「SKC」というのは「SubKeyCount」の略で、以下の部分の個数を表す。
image

「VC」は「ValueCount」の略で、以下の部分の個数を表す。
image

「プロパティ」は以下を指すようだ。
image

 

「Get-Item」を「Get-ChildItem」に変えると以下のようにサブキー毎に同様の情報が表示される。

PS>Get-ChildItem hkcu:software\TortoiseSVN


    Hive: HKEY_CURRENT_USER\software\TortoiseSVN


SKC  VC Name                           Property
---  -- ----                           --------
  0  17 DiffTools                      {.dll, .exe, .doc, .docm...}
  1   1 History                        {lastCheckoutPath}
  0   4 LastUsedUUIDsForGrouping       {0, 1, 2, 3}
  0   1 LogCache                       {Version}
  0   6 MergeTools                     {.doc, .docm, .docx, .ods...}
  0   6 StatusColumns                  {CommitDlgVersion, CommitDlg,
  1   0 TortoiseProc                   {}

プロパティの一覧は以下のように取得

PS>(Get-item hkcu:software\TortoiseSVN).property
SoundUtils KeyPath
TortoiseSVN
TortoiseMerge
TortoiseIDiff
DiffProps
CurrentVersion
CheckNewerWeek
RepoBrowserColumnWidth
ErrorOccurred
NewVersionLink
NewVersionText
NewVersion

これでも同じっぽい

PS>(Get-item hkcu:software\TortoiseSVN).getvaluenames()

ただし、どちらも取得できるのは文字列の情報。

以下の一行の情報をオブジェクトで取得できるのかと思ったのだが、どうにも見当たらない。
image

とりあえずダイレクトにバリューを取得するには、

PS>(Get-item hkcu:software\TortoiseSVN).GetValue("CheckNewerWeek")
16

ここで、「Get-ItemProperty」を試してみると、こちらは以下のオブジェクトを返してくる。(1つのオブジェクト)
「Get-Item」と違ってサブキーの情報は取得できない。
名前の通り、自身のプロパティに特化した情報といった感じ。
image

左側の「名前」(プロパティ)をその名の通りプロパティとして持っているオブジェクトなので、ダイレクトにバリューを取得するには、

PS>(Get-ItemProperty hkcu:software\TortoiseSVN).CheckNewerWeek
16

となる。

これを踏まえて「Get-Item」を使って一覧表示するには、プロパティ(ValueName)を纏めて取得し、その一つずつに対して「GetValue()」でバリュー、「GetValueKind()」で種類を取得する。
image

image

種類が不要であれば「Get-ItemProperty」だけで事足りる。(が、こちらは余計なプロパティも含まれる)

PS>Get-ItemProperty hkcu:software\TortoiseSVN


PSPath                 : Microsoft.PowerShell.Core\Reg
PSParentPath           : Microsoft.PowerShell.Core\Reg
PSChildName            : TortoiseSVN
PSDrive                : HKCU
PSProvider             : Microsoft.PowerShell.Core\Reg
SoundUtils KeyPath     : keypath
TortoiseSVN            : TortoiseSVN
TortoiseMerge          : TortoiseMerge
TortoiseIDiff          : TortoiseIDiff
DiffProps              :
CurrentVersion         : 1.8.4.24972
CheckNewerWeek         : 16
RepoBrowserColumnWidth : 00000000000000000000000000000
ErrorOccurred          : 0
NewVersionLink         :
http://tortoisesvn.net
NewVersionText         : A new version of TortoiseSVN
NewVersion             : 1.8.6.25419