Pages

Dec 15, 2006

Powershellのある生活 ~こんなことができるよ Vol.2~

ファイルのハッシュ値を取得する
    2つの方法がある。
  1. .netframeworkのGetHashCodeメソッドを使う
  2. System.Security.Cryptography.MD5CryptoServiceProviderを使う


   GetHashCodeメソッドの使う方法

    $t = New-Object System.IO.DirectoryInfo(任意のファイル)
    $t.GetHashCode()
    などとする。動かしてみると・・・
    PS C:\work\PowerShell> $crd.GetHashCode()
    53736498

    数字8桁で出力される。明らかにハッシュ値の衝突(コリジョン)が心配。
  System.Security.Cryptography.MD5CryptoServiceProviderを使う

System.Security.Cryptography 名前空間
http://msdn2.microsoft.com/ja-jp/library/system.security.cryptography(vs.80,d=toc).aspx

Get-MD5というファンクションを作成する。具体的には以下の内容を$PROFILEに追加する。

function Get-MD5([System.IO.FileInfo] $file = $(throw 'Usage: Get-MD5 [System.IO.FileInfo]'))

{

  $stream = $null;

  $cryptoServiceProvider = [System.Security.Cryptography.MD5CryptoServiceProvider];

  $hashAlgorithm = new-object $cryptoServiceProvider

  $stream = $file.OpenRead();

  $hashByteArray = $hashAlgorithm.ComputeHash($stream);

  $stream.Close();

  ## We have to be sure that we close the file stream if any exceptions are thrown.

  trap

  {

    if ($stream -ne $null)

    {

      $stream.Close();

    }

       break;

  }

  return [string]$hashByteArray;

}


特定フォルダ内の重複ファイルを削除する
このあたりを読め↓   

Windows PowerShell : Duplicate Files
    http://blogs.msdn.com/powershell/archive/2006/04/25/583225.aspx
    Windows PowerShell : Duplicate Files 2
    http://blogs.msdn.com/powershell/archive/2006/04/25/583226.aspx


調査中:CUIでWindows Live Messengerを使えるようなソフトを作りたい

vim,emacsなどのエディタを"PowerShell上で"使いこなす

Set-Alias vi 'C:\Program Files\vim\vim.exe'

    Vimerとしてこれ以外の解決策は思い浮かばない。ちなみに文字コードはUTF-8で統一していると後々トラブル少ない。

Unix系Shellのキーバインドが使いたい
・CTRL+Aで行頭、CTRL+EでEndなどの移動ショートカットを使う
・CTRL+Lでclear(cls)相当の動作をさせる
・CTRL+P, CTRL+N, CTRL+K, CTRL+Tなどを使う
これらは現状不可能

特定フォルダに存在するショートカットだけを削除する

    ショートカットファイルは拡張子がlnkなので"rm c:\temp\*.lnk"で一括削除
    rm c:\document and settings\all user\デスクトップ\*.lnkするとスッキリするかも。
設定してあるエイリアスを全て表示する
    get-alias
設定してあるエイリアスを削除する
    rm alias:\(エイリアス名)
実行中のプロセスからGetで始まるものを抽出する
    gal | Where {$_.Definition -like "Get*"}
    findstrという昔ながらのコマンドを使って"gal | findstr Get*"としても同じことができるのだけれども、それをやりだすとテキストの意味を「人間が」考えて処理していた時代に逆行してしまうというジレンマあり。
使用できるCmdletを全て表示する
    get-command
環境変数を確認する
    get-variable

    gvというエイリアスがデフォルトで設定してあるが、私は"Set-Alias env Get-Variable"と$PROFILEに書いている。
    補足: cmd.exeの環境変数にアクセスするためにenv:というドライブ名が設定されている。たとえば"$env:systemroot"とするとsystemrootが表示される。PowerShellのget-variableにenvのエイリ
アスを設定するのは誤解と勘違いの元かもしれない。注意されたし。

まだ続く