Pages

Showing posts with label powershell. Show all posts
Showing posts with label powershell. Show all posts

Feb 19, 2007

Powershell使っていて不満な点

grepがない、cutがない、wgetがないなどなどUnixマシンで使い慣れているコマンドがない(or使いにくい)のは不便。自分で書けば?と突っ込まれそうだけど。
Community Extensionなどでどんどん改善されると思われるので、今は待つしかない。

地味につらいのはCtrl+A, Ctrl+L, Ctrl+Eといったbash, zshであたりまえのキーボードショートカットが使えないこと。powershellのUIはcmd.exeと同じなので、F7でヒストリーを一覧表示、上矢印で履歴をひとつ戻る程度しかできない。

あとやっぱり遅い。powershellのプロンプトで入力可能になるまでに10秒以上待たされるのは厳しい。

以上2007/2現在の不満に思う点。

Dec 17, 2006

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

自動的に定義される変数(組み込み変数)の一覧
    Get-help about_automatic_variables | more

デスクトップフォルダやマイドキュメントフォルダに簡単にアクセスする
    DOSコマンド substを使って"subst P: 'C:\Documents and Settings\hoge\デスクトップ'"とすると指定のディレクトリをPドライブとして使用できる。このコマンドを$PROFILEに書いておけば便利。

WMIでコンピュータの情報を取得する
    mshより飛躍的に楽になっている。詳しくはPowerShell Week 3日目のスライド35のあたりから書いてある。

    get-wmiobject Win32_NetworkAdapter  | select-object MACAddress
イベントログを確認する
    get-eventlog -logname application -newest 5
出力をHTMLに変換
    ps | convertto-html | tee -file ps.html
コマンドの出力が長い場合に右端で折り返して表示する
    Get-Command | Format-Table -wrap | more
CPU使用率1%以上のプロセスをCPU使用率順に並べてHTMLで出力
ps | sort cpu -descending | where {$_.cpu -gt 1} | ConvertTo-Html |     tee -file heavyprocess.html
ps | where {$_.CPU -gt 1} | select processname,cpu | sort cpu -descending
ExcelをCOMオブジェクトを使って呼び出す
    $objE = new-object -comobject Excel.Application
    $objE.Visible = $true
    $objWB = $objE.Workbooks.add()
    $objWS = $objWB.Worksheets.Item(1)
    $objWS.Cells.Item(2,2) = "Feel the Power"
    $objE.Quit

レジストリにキーを追加する

FAQにサンプルがのっているが、その通りやっても上手くいかなかったので調査中


COMを使ってIEを呼び出す

    $tmp_myweb = "http://localhost:4664"
    $ie = New-Object -ComObject InternetExplorer.Application
    # IEプロセス起動。
    $ie.Visible = $true
    # IEが見えるようになる
    $ie.Navigate($tmp_myweb)
    # $tmp_mywebが表示される。
    $ie.Document.Body.InnerText

.net frameworkのWebClientクラスを呼び出して、Webページをダウンロードする

$tmp_myweb = "http://localhost:4664"
$web = new-object System.Net.WebClient
$page = $web.downloadstring($tmp_myweb)

このあたりでメソッドやプロパティの名前が分からない場合は"$web | get-member"して確認するとよい

ファイル選択のためのウィンドウを開く
    $objShell = New-Object -com "Shell.Application"
    $objFolder = $objShell.BrowseForFolder(0,"Pick ME!",0)

ファイルや変数の中身を比較する

diff(Compare-Object)を使う。直接ファイルを比較できないっぽい?

    $processes_before = get-process
    notepad # notepadを起動する
    $processes_after  = get-process
    compare-object -referenceobject $processes_before -differenceobject $processes_after
カラフルに出力
Write-Host -ForegroundColor red -BackgroundColor yellow "Red Hot Alert!!!"

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のエイリ
アスを設定するのは誤解と勘違いの元かもしれない。注意されたし。

まだ続く

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

最近Windows Power Shellを使いこなそうと頑張っている。

 

PowerShellそのもののバージョンを確認する

    get-host | select-object version
送るメニューにc:\program files\vim\vim.exeを追加する

WshのCreateShortcutを使って行う。

    $WshShell = New-Object -ComObject WScript.Shell
    # WshのCOMオブジェクト作成
    $lnk = $WshShell.CreateShortcut("$home\SendTo\gvim.lnk")
    # SendToの様なOS上の隠しフォルダはPowerShell上で補完がきかない。(はまった)
    $lnk.TargetPath = 'C:\Program Files\vim\gvim.exe'
    $lnk.Save()


    これをモトにln的cmdletを作ればいいんだけど、それはまかせた。(そこの誰かに)

調査中:デスクトップ上のアイコンを自動整列する

調査中:CD-ROMドライブをEjectする

実行中のサービスを確認する

    Get-Service | Where-Object {$_.Status -eq "running"}
mp3ファイルをリストアップ

    Get-ChildItem c:\work\music -include *.mp3 -recurse

続く