satocchiaブログ

satocchiaブログ

PR

キーワードサーチ

▼キーワード検索

プロフィール

satocchia

satocchia

カレンダー

お気に入りブログ

まだ登録されていません

コメント新着

effelpist@ kilovermek.es effelpist <a href="https://kilovermek.es/…
tomoZo@ Re:Pale Moon日本語化トラブル(06/06) はじめまして。 28.16.0でまたもや提供さ…
satocchia @ Re[1]:Pale Moon日本語化トラブル(06/06) zui_9さんへ 本日、確認しました。ようや…
zui_9 @ Re:Pale Moon日本語化トラブル(06/06) 上記リンク「Githubのプロジェクト」の左…
わたなべ@ Re:powershellコンソール、見づらくありませんか?(08/26) 初めまして、この情報最高です! 背景を白…

フリーページ

2020.09.13
XML
カテゴリ: powershell
powershellの関数(未確認だけどクラスも)は先に定義しておかなければ呼び出すことができません。
これは「仕様」です。

でも、プログラムするとき、最初に全体の構造を書いてあとから細かな関数なんかを書くほうが見通しが良くなります。逆に、長大な関数定義の後でメインルーチンがあると可読性もよくありません。最後まで読まないとなんのスクリプトかわからないからです。

多くのプログラム言語は関数をどこに書いてもOKですが、powershellがそうでないのはなぜなのでしょう。powershellスクリプトが本格的なプログラム(C++とかC#とか)を書く前段の プロトタイプ言語 プロトタイピング言語(2002/12/08修正)としても使われることを考えると、この「仕様」は更になぞです。

シェル言語だからそんなもんだという話もあろうかと思うのですが、バッチやunix系シェルとの互換性が決して良いとは言えないpowershellがこんな制限を引きずっていることは甚だ不満です。例えば、コマンドインタプリタとしてbasicを利用していた8ビット時代のパソコンですら、関数を後ろに書くことができました。OS/2で第二シェルとして使われたREXXなんかはもっと本格的なプログラム言語でした。

文句ばかり言っていてもきりがないので、対策。

$SKIP=$true;iex ((gc $MyInvocation.InvocationName|%{
    if ($SKIP -and ($_ -notmatch "^####FuncDef\s*$")){return}
    $SKIP=$false
    $_
})-join "`r`n")
$a=foobar|Write-Host  #エラーになる
function foobar{
    "foobar"
}
$b=hogefuga|Write-Host #正常動作
####FuncDef
function hogefuga{
    "hogefuga"
}

####FuncDef以降の行に書いた関数を先に読み込むというものです。
$aへの代入ではfoobarが定義されていないのでエラーになりますが、$bに代入されるhogefugaは####FuncDef





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2020.12.08 14:03:31
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: