Thursday, May 01, 2008

このBlogはhttp://techbank.jp/hiroへもクロスポストで運営しているのですが、そちらの方でRead-MultiLineメソッドの終端判定に"EOF"という文字列を指定できるかという質問がありました。

この関数はSQL*PLUSもどきで使用することを想定していたので、当初は";"が入力されたら入力を打ち切るように作りました。

(これはSQL*PLUSで実行するコマンドは";"を終端文字として判定しているからです)

しかし、このRead-MultiLineメソッドは「SQL*PLUSもどき」以外でも使用可能な関数であるため、終端判定を1文字以上でも行えるよう見直してみました。

下記が改訂版の関数です。

#=========================================================================================
# Read-MultiLine: コマンドラインから複数行の入力を受け取る
#
# UPDATE 2008/04/24		Ver.1.0.0 
#        2008/05/01		Ver.1.0.1 終了判定文字に1文字以上の文字列を指定できるよう修正
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#=========================================================================================
function global:Read-MultiLine ( [string]$prompt, [string]$endChar = ";" ){
	if ($args[0] -eq "-?" )
	{
		Write-Host @"
名前:
        Read-MultiLine

概要:
        コマンドラインから複数行文字列を取得します。

構文:
        Read-MultiLine [-prompt] [-endChar]

使用方法:
        -------------------------- 例 1 --------------------------
        `$a = Read-MultiLine
        
        この例はコマンドラインから複数行を取得し行終端が";"の場合に読み取りを中止し結果を返します。
        入力の終了を判定する文字は";"が規定値です。
        
        -------------------------- 例 2 --------------------------
        `$a = Read-MultiLine -prompt "文字列を入力してください"
        
        この例はプロンプトに"文字列を入力してください"と表示した後に入力を受け付けます。
        
        -------------------------- 例 3 --------------------------
        `$a = Read-MultiLine -endChar "#"
        
        この例は入力の終了を判定する文字を"#"とします。
        ユーザー入力の行終端が"#"である場合に、入力を中断し結果を返します
        
        -------------------------- 例 4 --------------------------
        `$a = Read-MultiLine -endChar "EOF"
        
        この例は入力の終了を判定する文字を"EOF"とします。
        ユーザー入力の行終端が"EOF"である場合に、入力を中断し結果を返します
        
"@ -foregroundcolor Cyan
        return
	}
	if ( $prompt.Length -gt 0 ){ Write-Host ($prompt + ":") }
	
	while(1)
	{
		$ip += Read-Host
		if ($ip.SubString($ip.Length - $endChar.Length) -eq $endChar){ break; }
		else{$ip += "`n"}
	}
	#Write-Host $ip
	
	
	return $ip.Substring(0, $ip.Length - $endChar.Length)
}

whileの中のif文を

if ($ip.SubString($ip.Length-1,1) -eq $endChar)

から

if ($ip.SubString($ip.Length - $endChar.Length) -eq $endChar)

へ変更しました。

Thursday, May 01, 2008 10:18:03 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Comments are closed.

Theme design by Jelle Druyts

Pick a theme: