2014年2月20日木曜日

◆ダウンロードフォルダーのパスを取得する

以下の記事を読んでいて気づいたこと。
Unblocking Download Files - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

ダウンロードフォルダーのパスを「$Home\Downloads」で取ってきているが、私の環境では取得できなかった。

私は基本的にプロファイルにぶら下がったフォルダーはすべてDドライブに移動しているので「D:\Downloads」になっている。

全うな取得方法を探してみたのだが、スペシャルフォルダーとかには「Downloads」は見当たらない。

止む無く、レジストリーを見渡したらIEのキーにDownloadsがあったのでとりあえずそれを使う事とした。

PS>$ieRegKey = "hkcu:\Software\Microsoft\Internet Explorer\Main"
PS>(get-itemproperty $ieRegKey)."Default Download Directory"
D:\Downloads

もう少し全うな方法があるのかしらん・・・

2014年1月20日月曜日

◆Ordered Hash Tableについてもメモ

ハッシュテーブルの順番は通常保証されていない。
image

保証するためには以下のように「Ordered」型に変換してあげる。
image

Insertなんかも出来るようになる。
image

この「Ordered」は3.0から追加された機能なので、2.0で使う場合は「Orderd」の実体である「OrderedDictionary」クラスを使う。
image

2014年1月9日木曜日

◆Foreach-Objectコマンドレットのループを抜ける

ForEachステートメントなどでは「continue」や「break」が使える(PowerShell: ◆ループを抜ける)が、Foreach-Objectコマンドレットではうまく行かないようだ。
image

どうやら「return」を使うと良さそうだ。
image

2014年1月8日水曜日

◆ダブルクォーテーション無しのCSVについて

頼まれてCSVを編集するスクリプトを作った。

CSVなら簡単簡単と思ったのだが(実際すぐにできたのだが)、出力されたCSVを見て、「ダブルクォーテーション無しにできる?」と言われてはたと考えてしまった。

簡単にできそうなものなのだが、コマンドレットでは対応していない感じ・・・。

ネットで調べても、「あとからReplaceして消せ」みたいな意見が主流。
そもそもニーズがあまり無いのかしらん・・・。
でも~、ExcelなんかでCSV作るとダブルクォーテーションは付いていないのよね。

なんかいただけない感じ。

仕方なく、ダブルクォーテーションを消したのだが、もうひとつおかしな点を指摘された。
項目の後ろにあるスペースが削られてしまうのだと。
見てみると、後ろのスペースは1つ(1バイト)になってしまう。

元のデータにダブルクォーテーションがついていないからなのですかね。
しかも、調べてみると、インポートでも削られるしエクスポートでも削られる仕様の様だ・・・。(><)

結構厳しいなあ・・・。

暫定的に、適当なエンドマークをスペースの後ろにくっ付けてスペースが削除されないようにしておき、後でエンドマークを削るなんて処理でごまかした。

 

まったく別の方法として、CSV系のコマンドレットを使わずに、CSVを配列に入れて処理して、最後にまたくっ付けるなんてのも有りか。

添え字参照になるので、保守性が今一つなのと、なんといってもこいつは処理が重い。

コマンドレットで対応しないかなぁ・・・。

2013年11月29日金曜日

◆取得したオブジェクトにオートナンバーキー列を付与する

http://social.technet.microsoft.com/Forums/ja-JP/ccf8e6fc-0220-4a0c-9fa5-16a1a680973a?forum=powershellja

こんな方法でもできそう。

001
002

$script:n = 0
ps | sort id | ft @{n="number";e={($script:n++)}},id,name -auto

スクリプト変数を使うとSelectやFormat出力の時に直接カウントアップできる。

また、カウントアップだけだと出力されないので括弧で囲むと良いようだ。
($script:n++)

これは
$script:n++;$script:nと同じ結果になる。

2013年11月27日水曜日

◆タスクスケジューラのジョブを纏めてエクスポートする

サーバーにしかけてあるジョブが増えてきたのでバックアップしておこうかと思ったのだが、GUIでは1つずつしかエクスポートできなさそう。

3.0が使えればコマンドレットが用意されているようだが、3.0を追加できないサーバーなので他の方法を探してみた。

「schtasks」か「Win32_ScheduledJob」あたりを使うのかなっと思って探しているとCOMを使ったそのものずはりのサンプルがあったので基本的にそのまま使わせていただいた。
Powershell, and exporting Windows Scheduled Tasks – TheGeekery

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

$outPath = "f:\desktop\wk"
$outFileName = "{0}.xml"

$sch = New-Object -ComObject("Schedule.Service")
$sch.Connect("localhost")
$tasks = $sch.GetFolder("\").GetTasks(0
)
 

$outfile_temp = Join-Path $outPath $outFileName
 
$tasks | %{
$xml = $_.Xml
$task_name = $_.Name
$outfile = $outfile_temp -f 
$task_name
$xml
 | Out-File $outfile
}

image

2013年11月19日火曜日

◆ISEを別のユーザーとして実行する

Launching PowerShell as Different User - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

 

PowerShellは「Shift」を押しながら右クリックすると「別のユーザーとして実行」メニューが表示されるので、それを選べばよい。
image

しかし、ISEは同じ方法では別ユーザーとして起動できない。

そんなときは、別のユーザーとして起動したPoserShellのコマンドラインで「ISE」と打ち込めばPowerShellを起動したユーザーでISEも起動される。