中小企業の働き方改革をサポート>>

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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPowerShellからPowerShellを呼び出す方法

PowerShellからPowerShellを呼び出す方法

次のバッチファイルと同等の事をPowerShellで行う方法を教えて下さい。

下記のような非常に簡易的なバッチファイルがあるとします。

■ aaa.bat ■
echo test
■ aaa.bat ■


■ bbb.bat ■
aaa.bat > aaa.log
■ bbb.bat ■


■ コマンドプロンプト ■
cmd> aaa.bat ・・・ 下に「test」と出力される
test
cmd> bbb.bat ・・・ ファイルaaa.logに「test」と出力される
■ コマンドプロンプト ■



同じ事をPowerShellでするとすれば

■ aaa.ps1 ■
echo "test"
■ aaa.ps1 ■


■ PowerShellの画面から ■
PS > ./aaa.ps1 ・・・ 下に「test」と出力される
test
PS > ./bbb.ps1 ・・・ ファイルaaa.logに「test」と出力される
■ PowerShellの画面から ■

この時の「bbb.ps1」はどのようになりますか?

PowerShellからPowerShellを呼び出す方法

次のバッチファイルと同等の事をPowerShellで行う方法を教えて下さい。

下記のような非常に簡易的なバッチファイルがあるとします。

■ aaa.bat ■
echo test
■ aaa.bat ■


■ bbb.bat ■
aaa.bat > aaa.log
■ bbb.bat ■


■ コマンドプロンプト ■
cmd> aaa.bat ・・・ 下に「test」と出力される
test
cmd> bbb.bat ・・・ ファイルaaa.logに「test」と出力される
■ コマンドプロンプト ■



同じ事をPowerShellでするとすれば

■ aaa.ps1 ■
echo "test"
■ aaa.ps1 ■


■ ...続きを読む

Aベストアンサー

回答番号:No.1 お礼へのアドバイスです。

>「キックして結果を待は待たずに次の処理をする」
>などのバリエーションは可能でしょうか?

使いこなせていませんがPowerShell 2.0ではバックグラウンドジョブが実現されました。下記の@ITの記事などが参考になると思います。

http://www.atmarkit.co.jp/fwin2k/winsv2008r2/03powershell/03powershell_03.html

Windows7で Start-Job, Get-Job, Receive-Jobが働くことを確認しました。

QPowerShellでのエラー出力の読み捨て

PowerShellでスクリプトを書いています。そこで、かならずメッセージが表示される処理があります。無視してかまわない内容なので、bash等の 2> /dev/null に相当するような「読み捨て」を行いたいのですが、PowerShell でのやり方がわかりません。ご存知の方、教えてください。

Aベストアンサー

2>Out-Null

参考URL:http://www.google.co.jp/search?hl=ja&q=powershell+redirect+error+null&lr=lang_ja

QPowerShellでの外部ファイルからの変数読み

PowerShelにおいて外部ファイルに書いてある変数を設定したと考えています。

たとえばread.iniファイルに下記の記載があるとします。
[yomikomi]
FilePath,C:\temp\test
MODRI,3
Message,"エラーが起きました"

このファイルをps1ファイルで読み込んで変数にしたい感じです。
$FilePath=C:\temp\testといった感じ)
区切り文字とかは何でもいいです。

読み込ませ形式についてはiniかps1形式が理想です。

ただ実行ps1ごとに読み込ませるファイルが異なるため.profileなどの初期読みこみ
系にかけない状況です。(profileがもっと応用的に使用できるならいいですが)

よろしくお願いします。

Aベストアンサー

丁度同じような話が出ました。
http://okwave.jp/qa/q6899282.html

ポイントの部分だけ抜き出したものを載せておきます。
不要行の読み飛ばしや配列利用は、適宜応用してみて下さい。


*** 以下の2ファイルを同ディレクトリに配置し、script.ps1を実行する ***

*** script.ps1 ***
Get-Content .\read.ini | Foreach-Object {
$name, $value = $_.split(',', 2)
Invoke-Expression "`$$name='$value'"
}

echo $FilePath $MODRI $Message

*** read.ini ***
FilePath,C:\temp\test
MODRI,3
Message,"エラーが起きました"

Qdosバッチ起動後、画面を閉じないようにしたい。

調査.batに1行type test.txtを表示するバッチを作成したのですが、すぐ画面がとじます。

dosバッチ起動後、コマンド画面を閉じないようにするには、次の行に何か書くのでしょうか。
宜しくお願いします。

Aベストアンサー

最後の行に
pause > nul
と加えてみてください。

何かキーを押すとウィンドウが閉じます。

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

QCSVファイルの中で、「 , 」カンマを使いたい

「 , 」で区切られたCSVファイルの中で、「 , 」カンマを使いたいのですが、可能でしょうか?

具体的には「これは1,500円でした。」というように、CSVファイルに収められた文章内で出てくる半角の数字(お金)の区切りに使いたいのです。
全角では代用したくないのですが、CSVファイルでデータを受け渡しする際に、困っています。

例えば、特殊文字などで対応可能でしょうか?

Aベストアンサー

受け渡しに使うと言うことは相手方のアプリケーションのことも考えなければいけないのですが・・・とりあえず対応が簡単そうな方法を。

1.各セルを""で囲む。(もちろんデータにダブルクォートがある場合はカンマと同様に困ります。
2.カンマで区切らずにタブで区切る。(比較的使われない文字ですが、やはりデータ中にタブがあるとカンマと同様です)

難しいけれど完璧に対応するためには、データ中の区切り文字は特殊な文字列に変更し、受け取り側のアプリケーションではその特殊な文字列をデータ中の区切り文字として扱うという方法が使われます。
例えば、データ中のカンマは\,にするとか。

データ作成側、受け取り側でそれぞれどこまで対応できるのか分かるともっと簡単かつ具体的な方法を回答できるかも知れません。

QPowerShellの「$変数=@"文字列”@」の意味がわかりません。

function RunningVMs{
$desc = @"
This specified VM is already runnning.
Please specified other strings.
Running VMs :
$RunVM
"@

参考URL
http://qiita.com/ine1127/items/8a01cbf4558733afc9cf

$dsec=@"文字列”@

Aベストアンサー

http://ufcpp.net/study/powershell/string.html

Qエクセルでの指定文字 カウントについて

エクセルで並んだデータでの指定した名前だけの個数をカウントするにはどうすればいいのでしょうか?

山田 高橋 佐藤
高橋 梅田 赤田
 西 山田 梅田
佐藤 山田 梅田

名前が並んだデータで「高橋」という名前が何個あるのかをカウントしたいのですがどうすればいいのでしょうか?

Aベストアンサー

 データは入力されているセルの範囲を「A1:C4」とすれば、

=COUNTIF(A1:C4,"高橋")

QPowerShellでテキストの空白行が消えない

PowerShellを使ってあるテキストを整形したいのですが、ネット上の文献等を参考にしてもまったく思い通りに動いてくれません。
どなたかお助け願えませんでしょうか。

下記のテキスト例をコピペしてもらうとわかると思いますが、最初から空白行があり、かつ文字列の後ろに無駄なスペースがあります。
整形の仕様として

・文字列「------------  」と「Power Shell 」は不要
・空白行不要

ループで不要な文字列は手始めに置換します。
そうするとさらに無駄な空白行が増えてしまうのでそれを削ることをしたいわけなのですが、行を削除する関数が見つかりません・・・
おまけに「`n`r」を検索して""と置換してみても行は消えません・・・

どなたか詳しい方いらっしゃいましたら教えて下さい。
よろしくお願いいたします。


<テキスト例 ここから>



------------  
Power Shell 

AAAAAAA AAAA
BBBBB bbbbb
CCCCCCCCCCCCCCCCCCCCC
DDDDD
EEEEEE
F

<テキスト例 ここまで>

PowerShellを使ってあるテキストを整形したいのですが、ネット上の文献等を参考にしてもまったく思い通りに動いてくれません。
どなたかお助け願えませんでしょうか。

下記のテキスト例をコピペしてもらうとわかると思いますが、最初から空白行があり、かつ文字列の後ろに無駄なスペースがあります。
整形の仕様として

・文字列「------------  」と「Power Shell 」は不要
・空白行不要

ループで不要な文字列は手始めに置換します。
そうするとさらに無駄な空白行が増えてしまうのでそれを削ることをしたい...続きを読む

Aベストアンサー

こんなのとか:

type a.txt|%{$_ -replace "[  ]+$", ""}|?{$_ -notmatch "^$|^Power Shell$|^-+$"}|%{$_ + "."}

なんのひねりもありませんが。

QPowerShellのスクリプト実行について

PowerShellのスクリプト実行について

PowerShellの勉強をしていますが、スクリプトを実行できません。。。
なんか、スクリプトの環境変数を設定するようですが、どこにも
設定方法がないです。。。。
もちろん、Set-ExecutionPolicy Unrestrictedは実行してあります。


以下日付と時間を表示するだけのスクリプトです。

---------test.ps1---------
get-date
get-time
----------------------------

スクリプトファイルの置き場所 ⇒ C:\script-test\test.ps1


ちなみに、スクリプトファイルを置いたディレクトリに移動して
実行しても、以下のようなメッセージが出て実行できませんでした。。

用語 'C:\script-test' は、コマンドレット、関数、スクリプト ファイル、または操作
可能なプログラムの名前として認識されません。名前が正しく記述されていることを確
認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく
ださい。
発生場所 行:1 文字:15
+ C:\script-test <<<< .\test.ps1
+ CategoryInfo : ObjectNotFound: (C:\script-test:String) []、Comma
ndNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException


どなたかご教授下さい。

PowerShellのスクリプト実行について

PowerShellの勉強をしていますが、スクリプトを実行できません。。。
なんか、スクリプトの環境変数を設定するようですが、どこにも
設定方法がないです。。。。
もちろん、Set-ExecutionPolicy Unrestrictedは実行してあります。


以下日付と時間を表示するだけのスクリプトです。

---------test.ps1---------
get-date
get-time
----------------------------

スクリプトファイルの置き場所 ⇒ C:\script-test\test.ps1


ちなみに、スクリプトファイルを置いたディレク...続きを読む

Aベストアンサー

No.1の追記です。
エラーの箇所は パスの 15文字目、つまり C:\script-test の次の(next)文字にあり、
エラー内容は CommandNotFoundException となっていますので、
「ファイルの拡張子がおかしい」ということです。
添付画像の上段のような指定をしているのであれば、
下段のように指定してみてください。
---
今回の場合は「環境変数」は関係ありません。
質問者さんが、なぜ「環境変数」を問題にしている理由が解りません。


人気Q&Aランキング

おすすめ情報