powershellで関数名を変更するとエラー

このQ&Aのポイント
  • powershell ISEおよびVC#内で関数名を変更するとエラーが発生します。
  • 再起動すると問題なくコンパイルされますが、検索してみると解決策は見つかっていません。
  • 関数名を変更して実行する際は注意が必要です。
回答を見る
  • ベストアンサー

powershellで関数名を変更するとエラー

お世話になります。 どうぞよろしくお願い致します。 powershell ISEで下記コードの関数名を変更すると "Add-Type : 型を追加できません。型名 'sample' は既に存在しています。…" という警告が発生します。 ただし、ISEを再起動すると問題なくコンパイルされます。 なぜでしょうか? どうぞよろしくお願い致します。  PS1 VC#内でスクリプトとして利用すると同じ問題が発生します。 同じく再起動すると解決します… PS2 検索してみると同じように悩みを持たれている方がいらっしゃるようですが 解決していないようです。 ttp://www.vistax64.com/powershell/224562-v2-ctp3-there-way-undo-action-add-type.html ttp://mtgpowershell.blogspot.com/2010_06_01_archive.html 下記コードで、 a() → aa() 等に関数名を変更してみてください。 $source=@" public class sample{ public static int a() { int b=2; return b; } } "@ Add-Type -TypeDefinition $source $e= [sample]::a() $e

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

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.4

多分、F5実行の度にPowerShellが完全終了→再起動みたいなイメージをお持ちなんではないでしょうか スクリプト言語をエディタからの自動実行とかさせたらそんなイメージですよね 次の3行をスクリプトペインに貼っつけて、まず走らせて下さい $n = 0 $n++ Write-Host $n 1が表示されたと思います。 次に1行目の「$n = 0」をコメントアウトしてから2回、3回とF5を押してください 増えてってますよね? つまり、F5押したときには前の続きで走っているようなイメージなんじゃないでしょうか 「シェル」ですから、これはこれで普通な気もします。 関数名を変更したら・・・と仰られていましたが、例えばint bの値を書き換えただけでも関数名変更時と同様のエラーが出ると思いますよ。 他に方法あるかもしれませんが、自分はISE終了させる他に初期環境から始める方法を知りません。

rechirin
質問者

お礼

ご返答ありがとうございます。 丁寧なご説明ありがとうございます。 おかげさまでようやく理解できてきました… で、つたないながらも一度終了させるために、アプリケーションドメインの 終了…と下記を組んでみましたが、$nは増えていくばかりで 終了していないようです… ご返答ありがとうございました。 $appDomain=[AppDomain]::CreateDomain("test1") $n++ Write-Host $n $appDomain [AppDomain]::Unload($appDomain) $appDomain

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「F5 を押す」たびに「スクリプトを実行する」んでしょ? だったら, 「エラーになる」のが当然であって, これで「なぜ?」と思う方がおかしい.

rechirin
質問者

お礼

ご返答ありがとうございます。 すいません。 どうもよくわかっていません。 いろいろ考えてみましたが、下記コードでもダメでした… アプリケーションドメインのFriendlyNameのID?が変わっているからでしょうか? どこか違う場所があれば、添削ください… $appDomain=[AppDomain]::CreateDomain("test1") $source=@" public class sample{ public static int a() { int b=2; return b; } } "@ Add-Type -TypeDefinition $source $e= [sample]::a() $e [AppDomain]::Unload($appDomain)

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.2

ISEで書き換えるたびにF5押しているイメージですよね? 多分、次のサイトが参考になります。 http://flamework.net/archives/8 ここの情報にあるとおり [AppDomain]::CurrentDomain.GetAssemblies() をコードの最後に入れとくと、F5結果表示する時の末尾に「False v2.0.50727 」みたいなのがどんどん増えていくと思います。

rechirin
質問者

お礼

ご返答ありがとうございます。 リンク先を読ませて頂いたのですが、リンク先のサンプルが難しく四苦八苦してます。 (まだまだ理解が足らないのだと思います) (MSNのアプリケーションドメインの説明を読んだり、メモリリークのないサンプルと見比べているのですが…) もし、上のサンプルに何行か追加すれば解決であれば、お教え頂けないでしょうか? ちょっと今のレベルでは、解決できそうにないです… 本当に申し訳ないです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

まさか「クラス sample を 2回定義しようとしている」などという愚かなことはしていませんよね?

rechirin
質問者

お礼

ご返答ありがとうございます。 NO.2さまの通りで、ISEで書き換えるたびにF5押しているイメージです。 ですので、F5を連続して押すというのが、sampleを2回定義しているに あたりますでしょうか?

関連するQ&A

  • 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は一体どういう関係なのでしょうか??

  • C言語の関数を読み込みません。

    今、ゲームのようなプログラムを作っていて、下はそのダメージ計算量を計算するプログラムを書いたつもりでいたのですが、どうやら「compatibility」と作った関数が計算されていないようです。 int compatibility(int a[2][3], int s, int t, struct monster monster[]) { int m; int add; printf("a2\n"); if( (monster[a[s][0]-1].tricktype == 1 && (monster[a[t][0]-1].type == 3 || monster[a[t][0]-1].type == 4)) || (monster[a[s][0]-1].tricktype == 2 && monster[a[t][0]-1].type == 1) || (monster[a[s][0]-1].tricktype == 3 && (monster[a[t][0]-1].type == 2 || monster[a[t][0]-1].type == 4)) || (monster[a[s][0]-1].tricktype == 4 && (monster[a[t][0]-1].type == 2 || monster[a[t][0]-1].type == 5)) || (monster[a[s][0]-1].tricktype == 5 && (monster[a[t][0]-1].type == 1 || monster[a[t][0]-1].type == 3)) /* 効果抜群 */ ){ m = (int)rand() % 2; if(m == 0) add = 1; if(m == 1) add = 2; }else{ if( (monster[a[s][0]-1].tricktype == 1 && (monster[a[t][0]-1].type == 2 || monster[a[t][0]-1].type == 5)) || (monster[a[s][0]-1].tricktype == 2 && monster[a[t][0]-1].type == 3) || (monster[a[s][0]-1].tricktype == 3 && (monster[a[t][0]-1].type == 1 || monster[a[t][0]-1].type == 5)) || (monster[a[s][0]-1].tricktype == 4 && (monster[a[t][0]-1].type == 1 || monster[a[t][0]-1].type == 3)) || (monster[a[s][0]-1].tricktype == 5 && monster[a[t][0]-1].type == 4 ) /* 効果いまひとつ */ ){ m = (int)rand() % 2; if(m == 0) add = 1; if(m == 1) add = 1/2; }else{ m = (int)rand() % 10; if(m == 0){ add = 2; }else{ if(m == 15){ add = 1/2; }else{ add = 1; } } } } return add; } int damage(int i, int a[2][3], struct monster monster[], int b[2]) { int add; double damage; int s, t, u; s = (i+1) % 2; t = i % 2; u = (int)rand() % 32; add = compatibility(a, s, t, monster); ・ ・ ・ } printf("a2\n");を関数内に用いて、実際にcompatibility関数を読み込んでいるのか確かめたのですが、コンパイラーにそう表示されることなく、関数を読み込んでいないのではと判断したしだいです。 長文すいません、お手数ですがどこをどのように変更すればいいのか、教えていただけるとありがたいです。 よろしくお願いします。 ちなみにa[2][3]はint型の配列、monsterはint型のtypeやtrickeffectを収入したもののつもりです。

  • 関数をまとめる

    関数をつくるときにどうまとめれば良いのでしょうか? 例えば下のようなプログラムがあったとします. #include<iostream> int add(int, int); int multi(int, int); int main(void) {    int a = 4;    int b = 3;    std::cout << add(a, b) << std::endl;    std::cout << multi(a, b) << std::endl; } int add(int a, int b) {    return a + b; } int multi(int a, int b) {    return a * b; } add関数は足し算の結果,multi関数は掛け算の結果を返します. やっている内容はかわらずわざわざ2つに分ける必要があるか?と思ってしまいます. 要は, int arithmetic_operations(int a, int b, int pattern) {    int result;    switch(pattern) {       case 1:          result = a + b;          break;       case 2:          result = a - b;          break;       case 3:          result = a * b;          break;       case 4:          if(0 == b) {             exit(1);          }          result = a / b;          break;       default:          break;    }    return result; } このような関数を用意してpattern変数で計算を制御するほうがまとまりがあると思います.ですが,いちいち中身を確認しながらプログラムを書く必要があるので可読性は低くなります. どちらがベターでしょうか?

  • PowerShellでのエラー

    半日たっても閲覧数0でしたので、タイトルとカテゴリーを変えました。 MBSAを用いてWindowsUpdateのオフライン適用に挑戦しています。 コマンドプロンプトで mbsacli.exe /xmlout /unicode /nd /nvc /catalog wsusscn2.cab > Updatecheck.xml により出力されたUpdatecheck.xmlの中身は <XMLOut> <CatalogInfo><CreationDate>2017-08-07T03:17:51Z</CreationDate></CatalogInfo> <Check ID="500" Grade="2" Type="5" Cat="1" Rank="1" Name="Developer Tools, Runtimes, and Redistributables のセキュリティ更新プログラム" URL1="Help/Check5311.html" URL2="Help/Check5311fix.html" GroupID="48ce8c86-6850-4f68-8e9d-7dc8535ced60" GroupName="Developer Tools, Runtimes, and Redistributables"><Advice>不足しているセキュリティ更新プログラムが 2 個あります。</Advice><Detail><UpdateData ID="MS11-025" GUID="bb49cc19-8847-4986-aa93-5e905421e55a" BulletinID="MS11-025" KBID="2538242" Type="1" IsInstalled="false" Severity="3" RestartRequired="false"><Title>Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージのセキュリティ更新プログラム (KB2538242)</Title><References><BulletinURL>http://www.microsoft.com/technet/security/bulletin/MS11-025.mspx</BulletinURL><InformationURL>http://go.microsoft.com/fwlink/?LinkId=216804</InformationURL><DownloadURL>http://download.windowsupdate.com/msdownload/update/software/secu/2011/06/vcredist_x86_b8fab0bb7f62a24ddfe77b19cd9a1451abd7b847.exe</DownloadURL></References></UpdateData><UpdateData ID="MS11-025" GUID="729a0dcb-df9e-4d02-b603-ed1aee074428" BulletinID="MS11-025" KBID="2538243" Type="1" IsInstalled="false" Severity="3" RestartRequired="false"><Title>Microsoft Visual C++ 2008 Service Pack 1 再頒布可能パッケージのセキュリティ更新プログラム (KB2538243)</Title><References><BulletinURL>http://www.microsoft.com/technet/security/bulletin/MS11-025.mspx</BulletinURL><InformationURL>http://go.microsoft.com/fwlink/?LinkId=216803</InformationURL><DownloadURL>http://download.windowsupdate.com/msdownload/update/software/secu/2011/05/vcredist_x64_a7c83077b8a28d409e36316d2d7321fa0ccdb7e8.exe</DownloadURL></References></UpdateData></Detail></Check> とずらずらと続いていっています。 これを読むのにExcelViewerのインストールはしたくないので linuxのxmltoを使おうとしました。 xmlファイルをutf8に変換後、 (最初"parser error : Input is not proper UTF-8, indicate encoding !"というメッセージが出たため) $ xmlto -o ./html_xml/ html Updatecheck_utf8.xml xmlto: /home/mess/Desktop/Updatecheck_utf8.xml does not validate (status 1) xmlto: Fix document syntax or use --skip-validation option /home/mess/Desktop/Updatecheck_utf8.xml:16: parser error : Specification mandate value for attribute teData teData ID="MS11-025" GUID="729a0dcb-df9e-4d02-b603-ed1aee074428" BulletinID="MS1 ^ <以下略> こんな感じでhtml変換に失敗します。 LibreOfficeCalcでメニューから「データ」、「xmlソース」を選択し ソースファイルでこのxmlファイルを選んでも「インポート」ボタンが暗いままで先に進めません。 ただ、結局やりたかったことは <DownloadURL> と </DownloadURL> に挟まれた部分を次々に抜き出していって、さらに行頭にwgetをつけて wget *ttp://download.windowsupdate.com/msdownload/update/software/secu/2011/06/vcredist_x86_b8fab0bb7f62a24ddfe77b19cd9a1451abd7b847.exe wget *ttp://download.windowsupdate.com/msdownload/update/software/secu/2011/05/vcredist_x64_a7c83077b8a28d409e36316d2d7321fa0ccdb7e8.exe (ここは最初の投稿時にサポート担当の方に編集されたようです) と続いていくスクリプトを自動生成したいということです。 ここまで書いた後、 http://dolls.orz.hm/?p=12070 http://dolls.orz.hm/?p=6166 にPowerShellを使ったやり方が書いてあるのに気づき、ここを参考にして管理者権限でPowerShellにおいて次の2行のコマンドを実行したのですが $xml = [XML](Get-Content Updatecheck.xml) $xml.XMLOut.Check.Detail.UpdateData | Where-Object {$_.IsInstalled.Contains("false")} | Select-Object {$_.References.DownloadURL} | Out-File downloadlist.txt> type .¥downloadlist.txt Out-File : パラメーター 'Encoding の引数を確認できません。引数 "type" は、ValidateSet 属性で指定されたセット "unicode、 utf7、utf8、utf32、ascii、bigendianunicode、default、oem" に属していません。このセットの引数を指定して、コマンドを再度 実行してください。 発生場所 行:1 文字:141 + $xml.XMLOut.Check.Detail.UpdateData | Where-Object {$_.IsInstalled.Contains("false")} | Select-Object {$_.References. DownloadURL} | Out-File <<<< downloadlist.txt> type .¥downloadlist.txt + CategoryInfo : InvalidData: (:) [Out-File]、ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.OutFileCommand 1行目は問題ないですが、2行目がご覧のようになります。 どのようにすればいいでしょうか? よろしくお願いします。

  • 関数の引数に丸カッコがあるとき

    C言語のアルゴリズムのサンプルのソースを見ていて 今まで見たことの無い形式があったのですが、 どのように調べればよいものか解らず 調べようにも調べられなくて困ってます。 具体的には以下のような感じの関数があるのですが、 これはどういった意味なのでしょうか? ご存知の方がいらっしゃれば アドバイスご伝授をよろしくおねがいします void sample( int a, int b(int, int), void c(int, int) ){  ... // ここに処理 }

  • jspで関数部分だけ分離することができますか?

    jspで関数部分を分離できないでしょうか? 例えば <%! public int add(int a,int b){return a+b;} %> このadd関数だけ別のファイルにして呼び出せないでしょうか。 <jsp:include page="add.jsp" flush="true "/> とやってもadd関数がcannot resolve symbolとなってしまいます。 jspの方が手間的に楽なのですが やはりサーブレットにするしかないのでしょうか? linuxのtomcat4.1です。

    • ベストアンサー
    • Java
  • Powershellのforのコードエラーについて

    過去に教えてもらったPowershellでExcelにデータを書き込むため2次元配列を使う方法についてターミナルで実行すると下記のようになります PS C:\Users\sakura> $excel = New-Object -ComObject Excel.Application; PS C:\Users\sakura> $excel.Visible = $true; PS C:\Users\sakura> $book = $excel.Workbooks.Add(); PS C:\Users\sakura> $sheet = $excel.Worksheets.Item(1); PS C:\Users\sakura> $array1 = ("果物","リンゴ" ,"ミカン", "バナナ","ぶどう") PS C:\Users\sakura> $array2 = ("個数","10", "20","5","8") PS C:\Users\sakura> $array3 = ("売上","1500", "2000","5000","300") PS C:\Users\sakura> $i = ((gv).Name -match "^array\d+$").Count PS C:\Users\sakura> $j = $array1.Length PS C:\Users\sakura> $arr = New-Object "object[,]" $i,$j PS C:\Users\sakura> $c = for($a=1;$a -le $i;$a++){for($b=0;$b -le $j;$b++){"`$arr[$($a-1),$($b)] = `$array$a[$b]"}}; PS C:\Users\sakura> $c | iex; OperationStopped: Index was outside the bounds of the array. OperationStopped: Index was outside the bounds of the array. OperationStopped: Index was outside the bounds of the array. PS C:\Users\sakura> $range = $sheet.Range("B2") PS C:\Users\sakura> $range.Resize($i, $j) = $arr PS C:\Users\sakura> $excel = $null; PS C:\Users\sakura> [GC]::Collect(); 別のアプリからコマンドラインで実行すればExcelに正しく書き込まれていたので気が付かなかったのですが今回PowershellでExcelの別操作をターミナルから試していた際ようやく気がついたのです。 何故 OperationStopped: Index was outside the bounds of the array. エラーとなるのでしょうかお教えください。

  • VLOOKUP関数のエラーについて

    ExcelでVLOOKUP関数を使って表を作成しようと思っています。コードを入力することによって、品名を表示させるようにしたいのですが、今までVLOOKUP関数は使ったことがないので、練習用として簡単な表を作成しました。コードはアルファベットA~Eと、数字1~5を使っています。コードが数字の場合は品名が正しく表示され、アルファベットの場合はAだけがエラーとなります。別の表で試したところ、やはりコードがAのものだけがエラーになります。なぜAがエラーになるのか理由がわかりません。 何が原因なのか、どうすれば正しく表示されるのかを教えていただきたく、よろしくお願いいたします。

  • enumをintとして扱う必要があるパターンはあるのでしょうか。

    enumをintとして扱う必要があるパターンはあるのでしょうか。 よく enum ENUM_SAMPLE {  A,  B,  C, }; class CLASS_SAMPLE { private:  int type; // ENUM_SAMPLEのA,B,Cしか入らない public:  int GetType(){ return type; } }; という記述を良く見かけます。 class CLASS_SAMPLE { private:  ENUM_SAMPLE type; // ENUM_SAMPLEのA,B,Cしか入らない public:  ENUM_SAMPLE GetType(){ return type; } }; のほうが良いのではないか思うのですが、intで定義することによる利点が何かあるのでしょうか。 あと、過去に // bcc利用時に問題があるのでintに変更しました int CLASS_SAMPLE::GetType {  return type; } というコメントがついたソースを見たことがあり、 自分でbccを使ってenumを返すように修正してテストしてみたことがあるのですが、何が問題なのか見つけることが出来ませんでした。 enum名を直接使用した場合に問題が発生することがあるのか、またどのような問題が発生することがあるのか、回答お願いします。

  • bsearch関数の呼び出しで

    C言語の深いところまで理解しようとしてます。今まで使わないだろうと思っていた関数へのポインタ なのですが、 2分探索のところで bsearch関数というのが出てきました。 この関数は第5引数に比較関数を引数にするのですが p = bsearch(&ky, x, nx, sizeof(int), (int (*)(const void *,const void *))int_cmp ); という形でサンプルソースには載っています。 この (int (*)(const void *,const void *))int_cmp の部分なのですが、まず戻り値をキャストするなら int (*)ではなく(int *)ではないでしょうか。 それとint_cmpは比較関数なのですが、引数が左側に来る、というところが納得できません。 ちなみにソースファイルをcppのままだとコンパイルできませんでした.cに拡張子を直したらコンパイルできました。 説明が足りないところがあったら指摘してください。お願いします。

専門家に質問してみよう