PowerShell Cookbookが良すぎる

先日『PowerShellポケットリファレンス』をとりあえずは読了して、『PowerShell Cookbook』(3rd edition)を読み始めたが、 改めて実用的なサンプルが盛りだくさんだと感動している次第。1000ページもあるのにどのレシピも役に立つものばかりだ。 例えば、$PS…

配列のflatten

配列において ((1,2), (3,4))→(1, 2, 3, 4)とflattenするメソッドを追加してみた。 <Types> <Type> <Name>System.Array</Name> <Members> <ScriptMethod> <Name>Flatten</Name> <Script> function _flatten { $args[0] | % { if($_ -is 'Array') { _flatten $_ } else { $_ } } } _flatten $this </scriptmethod></members></type></types>

vimからpowershell

set shell=C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exeとしておくと色々うれしい。 :r !Get-Dateで日時挿入。 :r !ls $doc -directory -recurse *hoge* | % fullnameでリンク集完成。 (パス名上でgfでそのファイルを開く。フルパスでなくて…

matchit.vimの設定

ftplugin\ps1.vimに以下を記述 let b:match_words = "if:else,(:),{:},[:],<#:#>,@\":\"@" これで % により <# と #>, if と else, @" と "@間で移動できるようになってスッキリ。

CubePDF用の一括リネームスクリプト

CubePDFではjpgで保存すると既定ではdocument-001.jpg, document-002.jpg, ...という連番ファイル名になる。 これを変更するにはファイル名入力フォームをマウスでクリックしてファイル名を入力すれば良いのだが、 キーボードだけで済ませたいのでスクリプト…

GMail認証に失敗するとき

Send-MailMessageでハマったのでメモ。 GMailに5.5.1 Authentication Required.と言われる時は、新しい端末またはアプリからのログインなのでGMail独自の2段階認証が必要な可能性がある。 しかし2段階認証に非対応なアプリ(Send-MailMessageするスクリプトも…

ここ数日

まずまずの学習ペースだがブログネタは無し。 ポケットリファレンスはもうすぐ読了。できれば2倍のペースで進みたい。 6月からC#もやる予定。

場所スタック関係のややこしい仕様

ややこしいので整理。pushdなどで用いられる場所スタック(location stack)には無名スタック(unnamed location stack)と名前つきスタック(named location stack)があるが、それとは別に「既定スタック」(default location stack)という概念もある。たとえば、…

スクリプト自身のパス、スクリプトを呼び出したスクリプトのパスを返す関数

よく分からないけどこれでいいんじゃなかろうか。 function Get-ScriptName { <# .SYNOPSIS スクリプト名を取得する。 .DESCRIPTION 引数なしならスクリプト自身のフルパス。 引数が$trueならスクリプトを直接呼び出したスクリプトのフルパス。 #> param([bo…

学習の進捗

Tipsが豊富なサイトを手当たり次第に見ては、必要なことをポケットリファレンス、インアクション(第1版の邦訳)で調べ、コードを自作している。が、分からないことが多くて学習のテンポが大幅に落ちてきた。PowerShellと直接関係のないことや細かいことへのこ…

カレントディレクトリの履歴

profile.ps1 $cdhistory = @() function prompt { if($global:cdhistory[-1].Path -ne $pwd.Path) { $global:cdhistory += $pwd } }> $cdhistoryで履歴表示 > $cdhistory[-2]|cdでカレントディレクトリを直前に戻す

Everythingを使った関数を書いてみた

everythingのコマンドラインツールes.exeを利用してファイル検索する関数を書いてみた。 function Everything { param([string]$word, [string]$dir=$(pwd)) start cmd.exe -Verb runas -ArgumentList "/c es.exe", $word, $dir, " | clip" sleep -m 500 # …

複数キーによるソート

$vectors = @() 1..5 | %{ $x = $_ 1..5 | % { $vectors += @{ x = $x; y = $_ } } } $vectors | sort @{ e={$_.x}; asc=$true },@{ e={$_.y}; desc=$true } | %{ ("(" + $_.x + ", " + $_.y + ")") }(1, 5) (1, 4) (1, 3) (1, 2) (1, 1) (2, 5) (2, 4) (2, …

switch文のfileオプションの2つの落とし穴

1つ目 Shift_JISで全角文字が化ける switch文にはfileオプションがあり、指定したファイルの各行をイテレート処理できる。しかしファイルがShift_JISの時は―― $fname = "test.txt" $txt = @" 1:Shift_JISにおける 2:全角のテスト "@ if(-not (Test-Path $fna…

孫ディレクトリ以下のファイルを子ディレクトリに移動

A (カレント) B1 C11 C12 ... B2 C21 C22 ... ...こんな感じのディレクトリ構成があり、ディレクトリC11, C12, ...かその子孫ディレクトリにあるファイルをB1に移動し、 ディレクトリC21, C22, ...かその子孫ディレクトリにあるファイルをB2に移動し、以下同…

Where-Objectのスクリプトブロックで複数の文を使いたいとき

へえこんなふうになるんだ > 1..3 | ?{ $_ % 2 } 1 3 > 1..3 | ?{ $false } > 1..3 | ?{ $true } 1 2 3 > 1..3 | ?{ $false; $false } # 注目 1 2 3whereのスクリプトブロックで複数の文使えない!?おさらい。where-objectの{ }は、フィルタースクリプトと…

反射的にワンライナーを書きたい

# 通し番号の十の位が1のファイルの名前を列挙 gci | ? name -like "*1?" | % nameうーん。まだまだ立ち止まって考えるレベル〜ゆっくり打ちながら考えるレベルだなぁ

ポケットリファレンス購入

CodeZineの記事読破。 http://codezine.jp/author/515 全部自分でサンプルプログラム考えて書いたら基礎力になった気がする。 ただし、Active Directory, Oracleは分からないのでパス。さて次は?ってことで好評なポケットリファレンス購入。片っ端からサン…

Functionプロバイダかっけえ

Functionプロバイダで存在する関数の情報にアクセスできるたとえば、 > function Foo(){ "test" }って関数を定義して、 > gci function: | ?{ $_.Name -eq "Foo" } | fl -property *で PSPath : Microsoft.PowerShell.Core\Function::Foo PSDrive : Function…

F2キー便利

たとえば > Get-PSBreakpoint -Script s1.ps1を実行してから > Get-PSBreakpoint -Script s2.ps1を実行したい。ここで、F2キーを押すと 入力文字の前までコピー:という表示がでて 1を入力すると > Get-PSBreakpoint -Script sと入力されるので、あとは 2.ps1…

プロファイルでエイリアスの記述された行を表示

PowerShellガンガン学習中。 $lines = gc $profile | ? { $_ -match "^sal|^Set-Alias" } echo $linesこれがSelect-Stringなら・・・ sls "^sal|^Set-Alias" $profileこう書ける。メリットは ・既製のもので短く書ける ・行数表示してくれる ・Contextパラメ…

エイリアスに引数つきのコマンドを登録する

http://technet.microsoft.com/ja-jp/scriptcenter/powershell_owner07.aspx を見ていて躓いたのでメモ。引数つきのコマンドはエイリアスに登録できない。 たとえば、sal ipca ipconfig /allとすると、「Set-Alias : 引数 '/all' を受け入れる位置指定パラメ…

test

そろそろPowerShellを始めたい