PowershellでCLIとISEの結果が違う

このQ&Aのポイント
  • PowershellでCLIとISEの実行結果に差異があります。原因と解決策を探しています。
  • ISEでスクリプトを作成すると正しい結果が得られますが、コンソールで実行すると異なる結果が表示されます。
  • Powershellのバージョンは4.0で、この差異の原因を特定したい。
回答を見る
  • ベストアンサー

PowershellでCLIとISEの結果が違う

ISEでスクリプト作成しています。 ISEは正常に動作していて正しい結果が得られるのですが、 同じスクリプトを実際にコンソールの方で実行すると違う結果になります。 例えば以下の様な簡単なスクリプトだと、 ISEでは100、コンソールでは1が表示されます。 ------------------------------------- $a = 1 function test{   $global:a = 100 } test Write-Host $a Start-Sleep -s 10 ------------------------------------- 原因と解決策はありますでしょうか? $PSVersionTableで調べたところバージョンは4.0です。

質問者が選んだベストアンサー

  • ベストアンサー
  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.1

調べてみたところ、スコープの問題でした。 「Windows PowerShell: スクリプト作成の短期集中講座 - TechNet」(http://technet.microsoft.com/ja-jp/magazine/hh551144.aspx)によると、 >ISE では、スクリプトは、グローバル スコープで実行されますが、通常のシェルのコンソールでは、スクリプトごとにスコープが設定されます。 とのことです。 つまり、1行目の「$a = 1」が、ISEではグローバルスコープで、ISE以外からの実行ではスクリプトスコープ(?)になります。 1行目を「$global:a = 1」にすればPowerShellのコマンドライン。 「PowerShell: スコープ」(http://mtgpowershell.blogspot.jp/2010/06/blog-post_21.html) も参考になります。

参考URL:
http://technet.microsoft.com/ja-jp/magazine/hh551144.aspx
omorinoya35234
質問者

お礼

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

その他の回答 (1)

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.2

No.1です。 お礼をいただきありがとうございます。 よく見たら回答が途中で切れておかしな文になっていました。 もう不要かもしれませんが念のために書くと 1行目を「$global:a = 1」にすればPowerShellのコマンドラインとISEで動作が同じになります。 と書くつもりでした。 >つまりglobal:付けた変数には全てglobal:付けておけと言う事ですかね。 そういうことなのでしょうね。 >正直ISEもコンソールと同じ動きであって欲しいです。 同感です。

omorinoya35234
質問者

お礼

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

関連するQ&A

  • powershellの配列について

    すみませんが、powershellの配列について、困っていることがあります。 下記に教えていただければと思います。 【やりたいこと】 スペースがバラバラに入っているファイルの中身を配列に格納したい。 その際、スペースを省いて数字のみ配列に入れたい 【今の状態】 > $test4 = $(Get-Content -path "C:\a.txt") > echo $test4 1 2 3 4 5 6 7 89 > write-host $test4[0] 1 > write-host $test4[1] (スペースが認識されてしまう) > write-host $test4[2] 2 【望む結果】 $test4にファイルの中身を格納する。 その後、以下の結果にしたい。 > write-host $test4[0] 1 > write-host $test4[1] 2 > write-host $test4[7] 89

  • PowerShellのルールについて

    PowerShellのルールについて PwoerShellのコマンドレットから以下の構文を実行すると、 エラーなしで実行できますが、ISEの方から実行するとエラー となってしまいます。 この違いはなんなのでしょうか? コマンドレットから実行 >funcion test { return $input } >1..4 | test 1 2 3 4 またコマンドレットからget-chikdItem Function:を 実行すると、定義済みの関数としてtestがでてきます。 ISEから実行すると > function test {retrun $input } > 1..4 | test 用語 'retrun' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認 してから、再試行してください。 発生場所 行:1 文字:22 + function test {retrun <<<< $input } + CategoryInfo : ObjectNotFound: (retrun:String) []、CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException となります。また、ISEからget-childitem Function:で確認すると、 testという関数は出てきません。 コマンドレットとISEは一体どういう関係なのでしょうか??

  • PowershellのStart-jobが動かない

    PowershellのStart-jobコマンドレッドが動かず困っております。 メモ帳を開くだけの単純なスクリプトです。本文一番下に実際のスクリプトを記載いたします。 Powershell ise上では正常に動くのですが、.ps1形式で保存し、右クリック>Powershellで実行 で実行するとPowershellは起動し、バックグラウンドでの動作もしているようなのですが、肝心のメモ帳が開かれません。 念のためタスクマネージャも確認しましたが、開かれている形跡はありませんでした。 どのようにすれば正常に動作させることができるのでしょうか。 ご教示頂ければ幸いです。 Start-job {Start-Process -FilePath "C:\Windows\System32\notepad.exe"}

  • Powershellでzip圧縮が出来ない

    Powershellでzip圧縮しようとしているのですが、 ・Powershell ISEで実行すると正常に圧縮 ・コマンドプロンプトで実行すると、「圧縮(zip形式)フォルダーエラー」が発生し、圧縮できない という現象が発生しています。コマンドプロンプトで実行できるようにしたいのですが、原因がわからないので、御教示をお願いします。 ・環境 Windows XP SP3 Powershell 2.0 ・Powershellソース # 引数チェック # 引数の数が2以外の時は異常終了 if ($args.Length -ne 2 ) { write-host "引数エラー" exit 2; } # 圧縮zipファイル名 $ZipFilePath = $Args[0] # 圧縮対象ファイル名 $TargetItems = $Args[1] # 圧縮先パス存在チェック if((Test-Path (Split-Path $ZipFilePath -Parent)) -ne $True){ write-host "圧縮先パスエラー" exit 3; } # 圧縮対象ファイル存在チェック if((Test-Path ($TargetItems)) -ne $True){ write-host "圧縮対象ファイルエラー" exit 4; } # Zipファイルが存在する場合は削除 if(Test-Path -Path $ZipFilePath) { Remove-Item -Path $ZipFilePath } # Zipファイル作成 Set-Content $ZipFilePath ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $ZipFilePath).IsReadOnly = $false # Zipファイルにファイルを投入 $shell = New-Object -com Shell.Application $zipfile = $shell.NameSpace($ZipFilePath) $archivedItems = New-Object Collections.ArrayList # 圧縮対象ファイルの数だけループ foreach($item in ($TargetItems | %{Get-Item -Path $_})) { # ファイルをZipファイルに投入。圧縮処理は非同期なので、その終了を待つ。 $archivedItems.Add($item) | Out-Null $zipfile.CopyHere($item.FullName) while($true) { if($archivedItems.Count -eq $zipfile.Items().Count) { break } Start-Sleep -Seconds 1 } } write-host "処理終了" exit 0

  • ownerDocumentの使い方を知りたいです。

    javascriptの.ownerDocumentの使い方を知りたいです。 https://developer.mozilla.org/ja/DOM/element.ownerDocument のサイトを参考に実際にいろいろ試してみました。 ーーーーーーーーーーーーーーーーーーーーー <script type="text/javascript"> function test1() { var a = 123; var b = a.ownerDocument; document.write(b); } </script> <div> <span onclick="test1()">テスト</span> </div> ーーーーーーーーーーーーーーーーーーーーー <script type="text/javascript"> function test2() { var a = this.ownerDocument; document.write(a); } </script> <div> <span onclick="test2()">テスト</span> </div> ーーーーーーーーーーーーーーーーーーーーー <script type="text/javascript"> function test3() { var a = this; var b = a.ownerDocument; document.write(b); } </script> <div> <span onclick="test3()">テスト</span> </div> ーーーーーーーーーーーーーーーーーーーーー 全てundefinedとなり、そのまま固まってしまいます。 .ownerDocumentはどのように使うのでしょうか。 アドバイスをよろしくお願いします。

  • クラスのメソッド

    inidat.phpに$global_a=3;と書いてありますがクラス内でこれが得られません。 <?php require_once 'inidat.php'; class test5 { var $a; function test5() { $this->a = 'inidat-a=' . $global_a; } } ?>

    • 締切済み
    • PHP
  • stdclassとstdClassは同じでしょうか?

    そもそもstdclassはどんなものでしょうか? manualを見ると 「変数のスコープ」の中に <?php function test_global_ref() { global $obj; $obj = &new stdclass; } function test_global_noref() { global $obj; $obj = new stdclass; } test_global_ref(); var_dump($obj); test_global_noref(); var_dump($obj); ?> この例を実行すると以下の出力が結果として表示されます。 NULL object(stdClass)(0) {} といった記述があります stdclassはどのように利用されるのでしょうか?

    • ベストアンサー
    • PHP
  • 結果を任意の位置で表示したい・・・。

    お世話になります。以下の件についてご教授いただければ幸いです。 [test.html] <script language="JavaScript" src="test.js"></script> <body> <form name="myFORM"> <textarea rows="3" name="myTEXT" onkeydown = "test(myTEXT.value);"></textarea> <div id="value"></div> </form> </body> [test.js] function test(word) { if(word == "aaa"){ return document.write("search result"); } } test.htmlのフィールドに特定の文字が入った場合に test.htmlの任意の場所に結果を表示したいのですが コードをそれぞれどのように変化させたらよいでしょうか? なお、input valueで値を入れるというのではなく レイヤーのような感じで結果を表示したいです。 よろしくお願いいたします。

  • 書き方が悪いのか?それとも仕様なのか?

    それとも、単純なミスに気がつかないのか、どうしても、期待した結果を表示させることができません。 document.write();内で「<!-- comment -->」や「<script ... </script>」はNGなのでしょうか? 現状としては、後述の内容をHTMLファイルとしてローカルに保存した後、ブラウザで、そのHTMLファイルを開いて結果を確認しています。 ブラウザは Firefox 2.0.0.19 で OS には Debian GNU/Linux etch を使用しています。 可能であるならば、表示できるようにしたいのですが、もし、無理であるなら、その原因(理由?)も知りたいです。 申し訳ありませんが、詳しいかた、どうぞ、よろしくおねがいいたします。 【期待している結果】 - Test Start - ------------------------------------------- ←<HR>の線 Script:document.write('<script language='Javascript'>document.write('Hello World'):</script>:End. 【実際の結果】 - Test Start - ------------------------------------------- ←<HR>の線 :End."); --> ---- ここからHTMLファイル内の内容 ---- <HTML> <HEAD> <TITLE>ScriptTest</TITLE> <script language="Javascript"> <!-- document.write("- Test Start -"); --> </script> </HEAD> <HR> <BODY> <script language="Javascript"> <!-- document.write("<!-- comment -->"); document.write("Script:document.write('<script language='Javascript'>document.write('Hello World'):</script>:End."); --> </script> </body> </HTML> ---- ここまでHTMLファイル内の内容 ----

  • JavaScript実行結果を保存

    PerlでJavaScriptを実行し、その結果を出力することはできるのでしょうか? 例えば、 <HTML><BODY> <script> <!-- document.write("テストです"); // --> </script> </BODY></HTML> 上記のようでしたら、 <HTML><BODY> テストです </BODY></HTML> と、そのまま表示したいのですが("<"等は"&lt;"等に置き換えます。)、できるのでしょうか? 上の例だと、document.writeだけを消してしまえばいいのですが、if文やfor文などがあると消すだけでは無理ですので。。 宜しくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう