satocchiaブログ

satocchiaブログ

PR

×

キーワードサーチ

▼キーワード検索

プロフィール

satocchia

satocchia

カレンダー

お気に入りブログ

まだ登録されていません

コメント新着

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) 初めまして、この情報最高です! 背景を白…
y__@ Re:uwscでGUIフォーム(05/12) UWSC 仮掲示板から飛んできました。 HTAで…

フリーページ

2016.08.18
XML
カテゴリ: powershell
System.Windows.FormsのSaveFileDialogではまった。

$openFileDialog = New-Object System.Windows.Forms.openFileDialog
$openFileDialog.ShowDialog()

なんてのを素のpowershell画面でやるとダイアログが出ないで固まるのは、前から対策してた。
$openFileDialog.ShowHelp=$true
の1行をShowDialogする前に入れとけばいいんだよね。

で、同じ調子でSystem.Windows.Forms.saveFileDialogなんだけど
既に存在するファイルを指定して「保存」とやると確認ダイアログが出るには出るんだけどそこで固まる。powershellのプロセスごと落とすしかなくなっちゃう。

OverWritePromptプロパティ(規定値は真)に$falseを設定すれば確認ウインドウが出なくなるのでハングすることはなくなるんだが、さすがにノーチェックで上書きとか怖すぎる。

結局、powershellをSTAモードで上げ直すしかないんだよね。


function  saveFileDialog( obj ){
  var  fso  =new ActiveXObject( 'Scripting.FileSystemObject' );
  var  wsh  =new ActiveXObject( 'WScript.Shell' );
    obj    =setDefaultProperties( obj )
  var  tmp;
    do{
      tmp  ='OpenFileDialog_' + fso.GetTempName();
      tmp  =fso.BuildPath( fso.GetSpecialFolder( 2 ), tmp );
    } while ( fso.FileExists( tmp ) || fso.FolderExists( tmp ) )
    powershell( generatePsCode( obj, tmp ) );
    while ( !fso.FileExists( tmp ) ){}
  var  newstr, oldstr;
    do{
      oldstr  =fso.OpenTextFile( tmp, 1, 0, -1 ).ReadAll();
      newstr  =fso.OpenTextFile( tmp, 1, 0, -1 ).ReadAll();
      for(timeup(1);!timeup();){}
    } while ( !newstr || newstr != oldstr )
    setTimeout( function(){Delete( tmp )}, 0 );
    return newstr.replace( /^\s+/, '' ).replace( /\s+$/, '' ).replace( /\r\n/g, '\n' ).split( '\n' );
  ///////以下内部関数
  function  powershell( ps ){
    var  tmp;
      do{
        tmp  ='ps1_' + fso.GetTempName().replace( /[.]tmp$/, '.ps1' );
        tmp  =fso.BuildPath( fso.GetSpecialFolder( 2 ), tmp );
      } while ( fso.FileExists( tmp ) || fso.FolderExists( tmp ) )
    var  fd  =fso.CreateTextFile( tmp, true, true );
      fd.Write( ps );
      fd.Close();
      do {
      } while ( ps != fso.OpenTextFile( tmp, 1, 0, -1 ).ReadAll() )
powershell -Sta  ' + tmp + ' "', 0, true );
        //ダイアログ自体はSTAモードでなくても、ShowHelpプロパティを真にすることで立ち上がる。しかし、上書き確認のダイアログが
        //上がらず、そこでハングする。
      setTimeout( function(){Delete( tmp )}, 0 );
  }
  function  Delete( path ){
    while( fso.FileExists( path ) ){
      try{
        fso.DeleteFile( path );
      } catch( e ){
        for(timeup(50);!timeup();){}
        arguments.callee( path );
      }
    }
  }
  function timeup( arg ){
    if ( !arguments.callee._TIME_LIMIT ){
      arguments.callee._TIME_LIMIT  =0;
    }
    var  now  =new Date();
    if ( arguments.length ){
      arguments.callee._TIME_LIMIT  =now.getTime() + arg;
    } else {
      if ( now.getTime() > arguments.callee._TIME_LIMIT ){
        return  true;
      }else{
        return  false;
      }
    }
  }
  function  generatePsCode( obj, tmp ){
    var  code  ='[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms");\n';
      code  +='$openFileDialog = New-Object System.Windows.Forms.SaveFileDialog;\n';
      for ( var prp in obj ){
        code  +='$openFileDialog.' + prp + '=' + obj[ prp ] + ';\n';
      }
      code  +='$openFileDialog.OverWritePrompt=$true;\n';
      code    +='$ret=$openFileDialog.ShowDialog();\n';
      code    +='if ( $ret -eq "OK" ){ $paths=$openFileDialog.FileNames}else{$paths="`r`n"};\n'
      code    +='$paths|out-file -encoding unicode ' + tmp
      return code
  }    
  function  setDefaultProperties( obj ){
    obj  =obj? obj :{};
    obj.InitialDirectory  =obj.InitialDirectory? obj.InitialDirectory : wsh.SpecialFolders( 'desktop' ).replace( /[/]/g, '\\' );
    obj.InitialDirectory  ='"' + obj.InitialDirectory + '"'
    obj.Title        =obj.Title? obj.Title : 'ファイル書き込み'
    obj.Title        ='"' + obj.Title + '"'
    obj.Filter        =obj.Filter? obj.Filter : 'すべてのファイル(*.*)|*.*'
    obj.Filter        ='"' + obj.Filter + '"'
    return  obj;
  }
}





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

最終更新日  2016.08.18 08:47:13
コメントを書く
[powershell] カテゴリの最新記事


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

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