プロが教えるわが家の防犯対策術!

ISEでスクリプト作成しています。
ISEは正常に動作していて正しい結果が得られるのですが、
同じスクリプトを実際にコンソールの方で実行すると違う結果になります。
例えば以下の様な簡単なスクリプトだと、
ISEでは100、コンソールでは1が表示されます。
-------------------------------------
$a = 1
function test{
  $global:a = 100
}

test
Write-Host $a
Start-Sleep -s 10
-------------------------------------

原因と解決策はありますでしょうか?
$PSVersionTableで調べたところバージョンは4.0です。

A 回答 (2件)

調べてみたところ、スコープの問題でした。



「Windows PowerShell: スクリプト作成の短期集中講座 - TechNet」(http://technet.microsoft.com/ja-jp/magazine/hh55 …)によると、
>ISE では、スクリプトは、グローバル スコープで実行されますが、通常のシェルのコンソールでは、スクリプトごとにスコープが設定されます。
とのことです。
つまり、1行目の「$a = 1」が、ISEではグローバルスコープで、ISE以外からの実行ではスクリプトスコープ(?)になります。

1行目を「$global:a = 1」にすればPowerShellのコマンドライン。

「PowerShell: スコープ」(http://mtgpowershell.blogspot.jp/2010/06/blog-po …) も参考になります。

参考URL:http://technet.microsoft.com/ja-jp/magazine/hh55 …
    • good
    • 0
この回答へのお礼

$global:aに変更したところ動きました。なるほどスコープの問題でしたか。
つまりglobal:付けた変数には全てglobal:付けておけと言う事ですかね。
正直ISEもコンソールと同じ動きであって欲しいです。
有難うございました。

お礼日時:2014/10/18 08:42

No.1です。


お礼をいただきありがとうございます。

よく見たら回答が途中で切れておかしな文になっていました。
もう不要かもしれませんが念のために書くと
1行目を「$global:a = 1」にすればPowerShellのコマンドラインとISEで動作が同じになります。
と書くつもりでした。

>つまりglobal:付けた変数には全てglobal:付けておけと言う事ですかね。
そういうことなのでしょうね。

>正直ISEもコンソールと同じ動きであって欲しいです。
同感です。
    • good
    • 0
この回答へのお礼

途中で切れていた件は大丈夫です。
やはりglobalを付けとくべきなのですね。
とりあえず解決策が見つかってよかったです。
二度も回答有難うございました。

お礼日時:2014/10/19 06:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!