C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2008/03/17 10:38
PowerShell Plus 1.0 Soft Launch

PowerShell の IDE だそうです。
有償ですが、試用期限 30 日のトライアル版もあるようです。
タグ: .NET PowerShell
2008/02/04 00:54

スクリプトコンテスト (応募締め切り:2008/02/10)

先ほど提出しました。
応募方法の Step1 から Step2 までの日数がかなり開いちゃったけど大丈夫かな。。。
タグ: .NET PowerShell
2008/01/08 23:16
Windows PowerShell スクリプトコンテストが開催中だそうです。
応募締め切りは 2008/02/10 です。

僕も参加しようと思ってます^^
応募は一人一回までって書いてあるけど、一度に複数スクリプトをまとめて送るってのもナシってことかな?


[ 情報元 ]
Shigeya Tanabe's blog : Windows PowerShell キャンペーン・スクリプトコンテスト開催中!


タグ: .NET PowerShell
2007/12/09 04:00
ScriptBlock クラス (System.Management.Automation)Invoke メソッドInvokeReturnAsIs メソッド を使ってスクリプトブロックを実行すると、スクリプトブロック内の param ステートメントによって宣言されたパラメータには、引数が格納されない。 ( $args 自動変数には格納されるけど。 )

で、とりあえず Pipeline クラス (System.Management.Automation.Runspaces) を使って実現してみた。

public static object InvokeScript(ScriptBlock target, params object[] args)
{
    StringBuilder argsTextBuilder = new StringBuilder();
    if (args != null)
    {
        for (int i = 0; i <= args.Length; i++)
        {
            argsTextBuilder.AppendFormat("`$invokeArgs[{0}] ", i);
        }
    }
    string invokeCommandText = string.Format("`$invokeArgs = `$Input | % {{ `$_; }}; &{{{0}}} {1}", target, argsTextBuilder);
    Command invokeCommand = new Command(invokeCommandText, true, true);
    using (Pipeline invokePipeline = Runspace.DefaultRunspace.CreateNestedPipeline())
    {
        invokePipeline.Commands.Add(invokeCommand);
        Collection<PSObject> invokeResult = invokePipeline.Invoke(args);
        object result = null;
        if ((invokeResult != null) && (invokeResult.Count != 0))
        {
            result = (invokeResult.Count == 1) ? (object)invokeResult[0] : (object)invokeResult;
        }
        return result;
    }
}


$Input が Enumrator であるのと、関数の引数の渡し方の関係で、ちょっとゴニョゴニョやってる。
もうちょいエレガントな方法はないものか・・・。
タグ: .NET C# PowerShell
2007/12/08 16:55
例えば Hoge 関数を取得するには、

$hoge = $Function:Hoge;


と書きますが、
同じように Fuga-Piyo 関数を取得しようとすると失敗してしまいます。
これは、関数名に含まれているハイフンが、演算子として解釈されてしまうためです。
では、どうやって Fuga-Piyo 関数を取得すれば良いかというと、${} という形式で変数を使用します。

$fugaPiyo = ${Function:Fuga-Piyo};


これで、Fuga-Piyo 関数を取得できます。

ちなみに、${} 形式で変数を宣言すれば、変数名に空白を含めることもできたりします。
タグ: .NET PowerShell
2007/11/27 21:43
ジェネリック型定義

型名の後に "`" をくっつけて ( エスケープ文字だから 2 回書く ) ジェネリックパラメータの数を書く。

$t0 = [System.Collections.Generic.Dictionary``2];



構築ジェネリック型 ( 1 )

通常、ジェネリック引数は "[アセンブリ修飾名]" という形式で指定する。複数指定する場合は ", " で区切る。ジェネリック引数全体を "[" と "]" で囲む。

$t1 = [System.Collections.Generic.Dictionary``2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089], [System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]];



構築ジェネリック型 ( 2 )

ジェネリック引数に指定する型のアセンブリが、ジェネリック型と同一のアセンブリの場合は、アセンブリ修飾名でなく、完全名でも可。

$t2 = [System.Collections.Generic.Dictionary``2[[System.String], [System.Int32]]];



構築ジェネリック型 ( 3 )

ジェネリック引数に指定する型のアセンブリが、ジェネリック型と同一のアセンブリではなく、更に GAC に登録されていない場合、記述が不可能。
代わりに、Type.MakeGenericType メソッドを使用して構築ジェネリック型を生成する。 ( 下の例では、コピペで簡単に実行できるように、String と Int32 を指定している。 )

$t3 = [System.Collections.Generic.Dictionary``2].MakeGenericType(@([System.String], [System.Int32]));


また、New-Object コマンドレットによるインスタンス生成も不可能。
代わりに、Activator.CreateInstance メソッド等を使用してインスタンスを生成する。

$d0 = [Activator]::CreateInstance($t3);

コンストラクタに渡す引数を指定してActivator.CreateInstance メソッドを使用する場合、コンストラクタに渡す引数が PSObject 型になっていないか注意する必要がある。例えば、New-Object で生成したオブジェクトは PSObject 型である。PSObject 型から生 ( ? ) のオブジェクトを取得するには、PSObject プロパティを参照し、更に BaseObject パラメータを参照する。


$i = [PSObject]100;
$d1 = [Activator]::CreateInstance($t3, @($i.PSObject.BaseObject));
# 下のコードではエラーとなる。
$d2 = [Activator]::CreateInstance($t3, @($i));
2007/11/25 16:46
PowerShell 関数の最終更新日:2008/08/24

自作の PowerShell 関数をまとめました。新しい関数を作成するたびに、これに追加していきます。
PowerShell 上で表示できるヘルプファイルを、各関数毎に用意してありますので、けっこう便利になっていると思います。
例えば、PowerShell 上で "Help New-WCFClient" と実行すれば、New-WCFClient 関数のヘルプが表示されます。

[ ダウンロード ]
YokoKen.PowerShell.Scripts ( YKPSScripts.zip )


[ 使用方法 ]
使用方法は、付属の ReadMe.txt を参照してください。


[ 関数一覧 ]
全部で 19 種類の関数が含まれています。関数名をクリックすると、詳細記事に移動します。

Build-SandcastleProject ( 作成日:2007/07/31 )
Sandcastle Help File Builder のプロジェクト ( 拡張子 .shfb ) をビルドします。

closure ( 作成日:2008/06/09 )
スクリプトブロックにクロージャ機能を付加します。

Compile-CSCode ( 作成日:2007/11/10 )
C# のソースコードをメモリ上にコンパイルします。

Compile-VBCode ( 作成日:2007/11/10 )
Visual Basic のソースコードをメモリ上にコンパイルします。

Create-ZipArchive ( 作成日:2007/10/21 )
指定したフォルダまたはファイルを Zip 形式で圧縮します。

Delete-VssRelation ( 作成日:2007/07/30 )
Visual Studio のソリューションから Visual SourceSafe の関連付けを削除します。

Edit-PSScript ( 作成日:2007/11/05 )
PowerShell スクリプトファイルを PowerGUI Script Editor で編集します。

Get-LatestSource ( 作成日:2007/07/25 )
Visual SourceSafe から最新のソースを取得します。

Get-OperationContract ( 作成日:2007/11/18 )
クライアントオブジェクト、またはクライアントクラス、またはサービスコントラクトから、オペレーションコントラクトの一覧を取得します。

Get-Parameter ( 作成日:2008/06/08 )
スクリプトブロックのパラメータ情報を取得します。

Invoke-NUnit ( 作成日:2008/04/03  )
NUnit を使用して記述されたユニットテストを実行します。

Invoke-Process ( 作成日:2008/04/03 )
プロセスを実行します。

New-WCFChannelFactory ( 作成日:2007/11/18 )
指定したサービスコントラクトのためのチャネルファクトリのインスタンスを生成します。

New-WCFClient ( 作成日:2007/11/18 )
SvcUtil.exe が生成したクライアントクラス ( ClientBase ジェネリッククラスの派生クラス ) をインスタンス化します。

New-WCFClientContent ( 作成日:2007/11/18 )
WSDL を元に、クライアントコンテンツを生成します。

New-WCFClientOrFactory ( 作成日:2007/11/18 )
New-WCFClient 関数、New-WCFChannelFactory 関数が内部で使用する関数です。
つまり、New-WCFClient 関数、New-WCFChannelFactory 関数を使用するにはこの関数が必要となりますが、この関数を利用者が直接呼び出すことはありません。

Rebuild-Solution ( 作成日:2007/07/26 )
Visual Studio 2005 のソリューションをリビルドします。

Set-MessageInspector ( 作成日:2007/12/09 )
WCF クライアントが要求メッセージを送信する前、応答メッセージを受信した後の 2 箇所に独自の処理を追加します。

try ( 作成日:2007/11/07 )
C# の try - catch - finally のような形式で、構造化例外処理を行うことが可能になります。
2007/11/21 22:24
プロファイル内に関数を直書きしてると、だんだん行数がかさんできて、メンテナンスがしづらくなってきます。
そこで僕は、関数は別のスクリプトファイル ( 1 関数につき 1 ファイル ) に記述しています。プロファイルでは、それらのスクリプトファイルを実行することで関数をインポートしています。

以下はプロファイルに記述しているコードです。

Microsoft.PowerShell_profile.ps1
Set-Variable -Scope "Global" -Option "Constant" -Name "GlobalScripts" -Value "$PSHome\Scripts";
Set-Variable -Scope "Global" -Option "Constant" -Name "Scripts" -Value ("{0}\WindowsPowerShell\Scripts" -f [Environment]::GetFolderPath("MyDocuments"));


function Execute-Scripts
{
    param ([String]$scriptsFolderPath)
   
    if (Test-Path $scriptsFolderPath)
    {
        Get-ChildItem $scriptsFolderPath -Include "*.ps1" -Recurse -Force | % { &($_.FullName); };
    }
}

Execute-Scripts $GlobalScripts;
Execute-Scripts $Scripts;


あとは、PowerShell のインストールフォルダ ( もしくは My Documents フォルダ内の WindowsPowerShell フォルダ ) 内に "Scripts" というフォルダを作成して、その中にスクリプトファイルを置いておけば、関数が自動でインポートされます。

なお、ファイルの中に書く関数は、function ブロックもちゃんと記述する必要があります。また、スコープを global に指定する必要があります。
例えば、"Hoge" と出力する Hoge 関数ならば以下のようになります。

Hoge.ps1
function global:Hoge
{
    return "Hoge";
}



関数をプロファイル内にいくつも書いている人には、かなりお勧めです。是非試してみてください。 (  既にやっている人もいそうだけど )


[ 関連記事 ]

Windows PowerShell プロファイル
タグ: .NET PowerShell
2007/11/20 01:01
実は最近まで全く使っていませんでした。
これは使わなきゃ損です。僕は損してました ^^;


プロファイルは、PowerShell の起動時に実行されるスクリプトファイルです。スナップイン、関数、変数、エイリアスの追加などに使用できます。
プロファイルは 4 種類あります。この辺の説明はこの記事では省略します。PowerShell 付属のドキュメント「Windows PowerShell™ ファースト ステップ ガイド」を参照してください。

プロファイルはスクリプトファイルですので、実行ポリシーの設定が絡んできます。実行ポリシーの既定の設定では、スクリプトファイルの実行はできません。プロファイルやそれ以外のスクリプトファイルを利用する場合は、実行ポリシーの設定を変更する必要があります。

実行ポリシーの変更は Set-ExecutionPolicy コマンドレットで行います。また、Get-ExecutionPolicy コマンドレットにて実行ポリシーの現在の設定を確認できます。
実行ポリシーに設定できる値は以下の 4 種類です。

Restricted
スクリプトファイルの実行を許可しません。

AllSigned
全てのスクリプトファイルは信頼された発行元によって署名されている必要があります。

RemoteSigned
インターネットからダウンロードしたスクリプトファイルは、信頼された発行元によって署名されている必要があります。

Unrestricted
全てのスクリプトファイルの実行を許可します。


実行ポリシーの設定変更はセキュリティの低下を意味します。上記 4 項目では、下に行くほどセキュリティが低くなっています。
PowerShell はとても強力です。もし、悪意のあるスクリプトを実行してしまった場合、大変なことになるかもしれません。実行ポリシーを変更する場合、そのことを充分承知してください。

AllSigned に設定した場合、自分で作成したスクリプトファイルにも署名を行う必要があります。また、署名後にスクリプトファイルを書き換えた場合、そのファイルに対して署名をしなおす必要があります。ちょっと面倒ではありますが、証明書が他者の手に渡らない限りは改ざんを防止できるという大きなメリットが得られます。

RemoteSigned に設定した場合、インターネットからダウンロードしたスクリプトファイル以外は、署名なしで実行できます。ただし、改ざんも検出しません。お手軽になりますが、インターネットからダウンロードしたスクリプトファイル以外には無防備です。

Unrestricted に設定した場合、全てのスクリプトファイルを署名なしで実行できます。さすがにこの設定は避けた方がいいと思います。


PowerShell にて以下のコマンドを実行すると、詳しい解説を読むことができます。実行ポリシーの変更方法や署名方法も載っています。

Help about_signing
タグ: .NET PowerShell
2007/11/15 22:35
今更気づきました^^;

PowerGUI 及び PowerGUI Script Editor は、C# の region ディレクティブによるアウトライン機能と同じ機能を備えています。
つまり、

#region function Hoge

function Hoge
{
    return "Hoge";
}

#endregion

って書けば

function Hoge

って感じに折りたたむことができます。
あと、単に { と } によるブロックにもアウトライン機能が働きます。
タグ: .NET PowerShell PowerGUI