カテゴリ:テクノロジ( 198 )

AutoHotKey_Lで、AviUtlのバッチ登録を自動化した。

 AviUtlで複数ファイルをエンコードする場合「バッチ登録」を使うのだけど、手作業で出力ファイル名入力するのが面倒すぎたので自動化した。

 変換したい動画のパスリスト(\n区切り)をクリップボードに入れて、AviUtlメインウィンドウでF12打鍵すれば登録開始。
 出力ファイルは"元ファイル名.設定した拡張子"で、重複してれば接尾辞"_[n]"で回避。
 使用前に"OutputPluginNum"と"SaveFileExt"を設定すべし。

;--------------------------------------------------------------------------------------
; AviUtl
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class AviUtl ahk_exe Aviutl.exe

F12::  ; クリップボードのパスをバッチ登録
  
  OutputPluginNum := 1  ; "プラグイン出力"で選択するプラグインの番号。1番上は1。
  SaveFileExt := "mp4"  ; 出力ファイルの拡張子。
  
  
  
  PathList := Clipboard
  
  WinGet, WHwnd, ID
  WinGet, ExePath, ProcessPath
  SplitPath, ExePath, , ExeDir
  IfExist, %ExeDir%\batch*.aup
  {
    MsgBox, 262691, , バッチ登録されたプロジェクトが存在します`n既存のプロジェクトを削除しますか?
    IfMsgBox, Cancel
      return
    IfMsgBox, Yes
      FileRecycle, %ExeDir%\batch*.aup
  }
  
  StringReplace, PathList, PathList, `n, `n, UseErrorLevel
  MaxNum := ErrorLevel
  
  Loop, Parse, PathList, `n, `"
  {
    TipView(A_Index "/" MaxNum)
    
    FilePath := A_LoopField
    IfNotExist, %FilePath%
      continue
    
    SplitPath, FilePath, , FileDir, , FileNoExt
    
    SaveFilePath := FileDir "\" FileNoExt "." SaveFileExt
    while FileExist(SaveFilePath)
      SaveFilePath := FileDir "\" FileNoExt "_[" A_Index "]." SaveFileExt
    
    WinMenuSelectItem, ahk_id %WHwnd%, , ファイル, 1&  ; "開く"
    WinWait, ファイルを開く ahk_class #32770 ahk_exe Aviutl.exe
    ControlSetText, Edit1, %FilePath%  ; "ファイル名"
    Sleep, 100
    ControlClick, Button2, , , L, 2  ; "開く"
    WinWaitClose
    
    WinMenuSelectItem, ahk_id %WHwnd%, , ファイル, プラグイン出力, %OutputPluginNum%&
    WinWait, ahk_class #32770 ahk_exe Aviutl.exe
    ControlSetText, Edit1, %SaveFilePath%  ; "ファイル名"
    Sleep, 100
    ControlClick, Button5, , , L, 2  ; "バッチ登録"
    WinWaitClose
  }
  
  TipView("FIN")
return


;--------------------------------------------------------------------------------------
; TipView.ahk
;--------------------------------------------------------------------------------------

TipView(TextBuf = "", Timer = 3000, X = "", Y = "", SW = 0) {
  if SW
    CoordMode, ToolTip

  ToolTip, %TextBuf%, X, Y
  if !Timer
    Timer := "Off"
  SetTimer, TipClose, %Timer%
}

TipClose:
  SetTimer, TipClose, Off
  ToolTip
return


[PR]
by LordNoesis | 2017-05-17 18:29 | テクノロジ | Trackback | Comments(0)

エキブロにログインできない場合の対処。

 エキサイトブログはサードパーティCookieをブロックしているとログインできないので、許可リストにhttps://idcaccounts.exblog.jpを登録する。


 Vivaldiはサイト別許可リストが標準の設定画面になく、Blink由来の設定画面にしかないので、chrome://settings/contentExceptions#cookiesに飛んで[*.]idcaccounts.exblog.jpを登録すればよい。
 なお、アドレス中の「chrome://」を「vivaldi://」に置換する雑な仕様があるので、アンカー書いたりブックマークする時は注意。


[PR]
by LordNoesis | 2017-02-08 21:07 | テクノロジ | Trackback | Comments(0)

Win10で自作実行ファイルが「既定のプログラム」に表示されなくなったので直した。

 拙作「S2WA」を、レジストリを弄って「既定のプログラム」に登録してブラウザに振り分けするとめちゃ便利なのだが、Win7ではできてたのにWin10にアップグレードしたら「既定のプログラム」に表示されなくなった。PC設定>既定のアプリだと、表示はされるけど選択できなかったり。
 レジストリが間違ってる or Win10で変わった?EXEの権限?アンチウィルスによるブロック?等々あれやこれや、本当に何っっっ時間も悩んだ挙句、「Win10でコンパイルし直したら認識された」とか徒労感ハンパない。
 AHKで作ったEXEだけでなく、古いHSP版もダメだった。スクリプト系がブロックされてる? でも認識されないだけで動作は問題ないしなあ? あとコンパイル時の文字コードとか32bitと64bitとかUPXやMPRESSとか、気にならなくもないが検証する気力は残ってない。とりあえず認識されたからよし。


[PR]
by LordNoesis | 2016-07-02 21:53 | テクノロジ | Trackback | Comments(0)

TabJugglerでスクロールできない問題を解決した。

 TabJugglerというタブ管理用のChrome拡張があって、すべての互換ブラウザに入れてるくらい便利なのだが、操作できなくなる問題があるので対処した。

 そもTabJugglerは、すべてのタブを対象とした「ひとつのウィンドウにまとめる」「ウィンドウを分離する」「タブの配置をソートする」という機能と、検索でリストアップした、あるいはしなかったタブを対象とした「閉じる」「分離する」という機能がある。この後者の検索で大量のタブをリストアップすると、操作ボタンが押し出されて操作不能になってしまう。大量のタブがあるからこそ使いたいのに!
 で、調べてみたら操作不能の原因はスクロールを禁じたスタイルにあったので、CSSをたった1行いじるだけで解決したという……。

 問題のCSSはExtensions\jgiplclhploodgnkcljjgddajfbmafmp\バージョン番号\assets\styles\popup.css。ExtensionsフォルダはOperaならProfile、ChromeとVivaldiならUser Data以下にあるが、識別子jgiplc(以下略)を検索した方が手っ取り早い。
 そのpopup.cssの11行目にあるoverflow: hidden;を、hiddenからscrollにすれば完了。


[PR]
by LordNoesis | 2016-02-11 20:00 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、標準出力を得たい……。

 以前見つけた関数だと上手く動かないことがあったのでフォーラム検索したら、もっと新しいやつを見つけた。見つけたんだが、標準出力が多いと文字化けすることが発覚。ReadFileでバイト単位で取得したデータをそのままデコードしてるせいだと思うが、AHKで文字列でないデータを操作とか苦行の予感がするので、Fileオブジェクトで文字単位で取得してごまかした。
 文字化けはなくなったが、本当にこれで問題ないのかは解らん。

; https://autohotkey.com/board/topic/54559-stdin/#entry687172

  MsgBox % sOutput := StdoutToVar_CreateProcess("tasklist /s " A_ComputerName)

StdoutToVar_CreateProcess(psCmd, psInput="", psEncoding:="CP0", psDir:="", ByRef pnExitCode:=0) {
  
  DllCall("CreatePipe", PtrP, hStdInRd, PtrP, hStdInWr, Ptr, 0, UInt, 0)
  DllCall("CreatePipe", PtrP, hStdOutRd, PtrP, hStdOutWr, Ptr, 0, UInt, 0)
  DllCall("SetHandleInformation", Ptr, hStdInRd, Uint, 1, Uint, 1)
  DllCall("SetHandleInformation", Ptr, hStdOutWr, UInt, 1, UInt, 1)
  
   VarSetCapacity(pi, (A_PtrSize == 4) ? 16 : 24, 0)
  siSz := VarSetCapacity(si, (A_PtrSize == 4) ? 68 : 104, 0)
  NumPut(siSz, si, 0, "UInt")
  NumPut(0x100, si, (A_PtrSize == 4) ? 44 : 60, "UInt")
  NumPut(hStdInRd, si, (A_PtrSize == 4) ? 56 : 80, "Ptr")
  NumPut(hStdOutWr, si, (A_PtrSize == 4) ? 60 : 88, "Ptr")
  NumPut(hStdOutWr, si, (A_PtrSize == 4) ? 64 : 96, "Ptr")
  
  If (!DllCall("CreateProcess", Ptr, 0, Ptr, &psCmd, Ptr, 0, Ptr, 0, Int, True, UInt, 0x08000000
   , Ptr, 0, Ptr, psDir ? &psDir : 0, Ptr, &si, Ptr, &pi))
   return
   , DllCall("CloseHandle", Ptr, hStdOutWr)
   , DllCall("CloseHandle", Ptr, hStdOutRd)
   , DllCall("CloseHandle", Ptr, hStdInRd)
  
  DllCall("CloseHandle", Ptr, hStdOutWr ) ; The write pipe must be closed before reading the stdout.
  
  if (psInput != "")
   FileOpen(hStdInWr, "h", psEncoding).Write(psInput)
   DllCall("CloseHandle", "Ptr", hStdInWr)
  
  
; ################################################################################
  
  
  StdOutBuf := FileOpen(hStdOutRd, "h", psEncoding)
  StrBuf := 1
  while StrLen(StrBuf) {
   StrBuf := StdOutBuf.Read(2047)
   sOutPut .= StrBuf
  }
  
  
; ################################################################################
  
  
  DllCall("GetExitCodeProcess", Ptr, NumGet(pi, 0), UIntP, pnExitCode)
  DllCall("CloseHandle", Ptr, NumGet(pi, 0) )
  DllCall("CloseHandle", Ptr, NumGet(pi, A_PtrSize) )
  DllCall("CloseHandle", Ptr, hStdOutRd )
return sOutput
}


[PR]
by LordNoesis | 2016-02-09 20:00 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Opera12の起動を便利にしてみた。 ver.2.3.1

 セッション変換に失敗することがあったので1行だけ修正。今更使う人もいないと思うが。

; --------- --------- --------- --------- ---------
; RunOpera.ahk ver.2.3.1
; --------- --------- --------- --------- ---------

#WinActivateForce

  OperaPath := "R:\Opera"  ; Opera.exeの存在するパス。末尾"\"は不可。
  
  if %0%  ; 引数があった場合、Operaのパスと見なす
    OperaPath = %1%
  
  SessionsPath := OperaPath "\profile\sessions"  ; セッションフォルダのフルパスを指定。末尾"\"は不可。
  BookmarksPath := OperaPath "\profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。
  
  TimeLimit := 30  ; 最終セッション退避確認ダイアログを自動でスキップするまでの秒数。
  
  AutoConvSW := 1  ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
  ACMoveSW := 1  ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。
  
  StackSW := 1  ; スタックの設定。 0:無視する。 1:スタックごとにフォルダを分ける。
  
  HisReadSW := 0  ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
  His0PrefixSW := 0  ; タブ履歴がなかった場合のプレフィックスの設定。 0:なし。 1:0を明示する。
  
  WriteTrgSW := 1  ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。
  
; --------- --------- --------- --------- ---------
  
  IfNotExist, %SessionsPath%\
  {
    MsgBox, 16, , セッションフォルダが見つかりません。`n%SessionsPath%
    ExitApp
  }
  If WriteTrgSW {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, 16, , bookmarks.adrが見つかりません。`n%BookmarksPath%
      ExitApp
    }
  }
  
  IfNotExist, %SessionsPath%\autosave.win
  {
    IfExist, %SessionsPath%\autosave.win.bak
      FileMove, %SessionsPath%\autosave.win.bak, %SessionsPath%\autosave.win
  }
  IfExist, %SessionsPath%\autosave.win
  {
    FileCopy, %SessionsPath%\autosave_RunOpBak.win, %SessionsPath%\autosave_RunOpBak2.win, 1  ; ↓セッション退避etc.を実行しない時も念のため2世代バックアップ。
    FileCopy, %SessionsPath%\autosave.win, %SessionsPath%\autosave_RunOpBak.win, 1
    GoSub, SessionAnalyze
  }
  
  FileCopy, %OperaPath%\ui\fastforward_backup.ini, %OperaPath%\ui\fastforward.ini, 1  ; アップデートのたびにFastForward.iniが初期化される問題の対策。
  
  Run, %OperaPath%\opera.exe, , , OpPid
  WinWait, ahk_pid %OpPid%, , 60
  if !ErrorLevel {
    ifWinExist, Opera へようこそ ahk_pid %OpPid%
    {
      WinActivate
      WinWaitClose
    }
  } else {
    return
  }
  
  WinWait, マスターパスワードを入力してください ahk_pid %OpPid%, , 5
  If ErrorLevel
    return
  WinSet, Topmost, ON
  WinActivate
  Sleep, 300
  
ExitApp

; --------- --------- --------- --------- ---------

SessionAnalyze:
  FileRead, OSession, *P65001 *t %SessionsPath%\autosave.win
  If ErrorLevel {
    MsgBox, 48, , Sessionの読み込みに失敗しました。`n%SessionsPath%\autosave.win
    return
  }
  
  Idx := 0
  WinTitles := ""
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\][\s\S]+?count=(\d+)", $, Idx + 1)
    If !Idx
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    WinTitles .= " " HisTitle "`n"
  }
  If !WinTitles
    return
    
  SetTimer, RenewCount, 1000
  MsgBox, 259, 退避確認(30秒後に通常起動), 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, %TimeLimit%
  SetTimer, RenewCount, Off
  IfMsgBox, Yes
  {
    TimeNum := A_Now
    BackupName := TimeNum ".win"
    Loop {
      FileMove, %SessionsPath%\autosave.win, %SessionsPath%\%BackupName%
      If !ErrorLevel  ; 最終セッションのリネームに成功なら
        Break
      BackupName := TimeNum "_" A_Index ".win"
    }
    FileDelete, %SessionsPath%\autosave.win.bak
    If AutoConvSW
      GoSub, SessionConvert
  }
  IfMsgBox, Cancel
    ExitApp
return

; --------- --------- --------- --------- ---------

RenewCount:
  IfWinExist, 退避確認( ahk_class #32770
  {
    TimeLimit--
    WinSetTitle, 退避確認(%TimeLimit%秒後に通常起動)
    if !TimeLimit
      SetTimer, RenewCount, Off
  }
return

; --------- --------- --------- --------- ---------

SessionConvert:
  If WriteTrgSW
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%  ; bookmarks.adrのバックアップは無制限なので注意
  
  CmdLine := SessionsPath "\" BackupName
  SplitPath, CmdLine, , , , SessionName
  Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
  ResultBuf := Result
  
  Idx := 0
  BefGroupNum := 0
  His0Prefix :=
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)\][^\[]+group=(\d+)[^\[]+\[\1history url\][^\[]+count=(\d+)", $, Idx + 1)
    If !Idx
      Break
    WinNum := $1
    GroupNum := $2
    HisNum := $3 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
    
    if StackSW
      if (BefGroupNum != GroupNum) {
        if BefGroupNum
          Result .= "-`n`n"
        if GroupNum
          Result .= "#FOLDER`n  NAME=[Stack] " GroupNum "`n`n"
        BefGroupNum := GroupNum
      }
    
    If !HisReadSW {  ; タブ履歴を無視する場合
      Result .= "#URL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    
    StringLen, HisNumLen, HisNum
    
    If !HisNum {
      if His0PrefixSW
        His0Prefix := "[" ZeroSupply(HisNum, HisNumLen) "] "
      Result .= "#URL`n  NAME=" HisPrefix HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    Result .= "#FOLDER`n  NAME=" HisTitle "`n`n#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    
    Loop, %HisNum% {
      HisNum--
      HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
      HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    }
    Result .= "-`n`n"
  }
  
  If (ResultBuf == Result)
    return
  Result .= "-`n`n"
  
  If WriteTrgSW {
    FileRead, BMBuf, *t *P65001 %BookmarksPath%
    StringGetPos, Idx, BMBuf, #DELETED
    if !Idx {
      StringMid, BMBufP, BMBuf, 1, Idx
      StringMid, BMBufS, BMBuf, Idx + 1
      Result := BMBufP Result BMBufS
      FileDelete, %BookmarksPath%
    }
    FileAppend, %Result%, %BookmarksPath%, CP65001
  } Else {
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt, CP65001
  }
  
  If ACMoveSW {
    IfNotExist, %SessionsPath%\AutoConv\
      FileCreateDir, %SessionsPath%\AutoConv\
    FileMove, %CmdLine%, %SessionsPath%\AutoConv\%BackupName%
    If ErrorLevel
      MsgBox, 48, , 変換済みセッションの移動に失敗しました。`n%SessionsPath%\AutoConv\
  }
return

; --------- --------- --------- --------- ---------

GetHisTitle(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history title\][\s\S]+?" HisNum "=(.*?)\r?\n", $)
  return $1
}

GetHisUrl(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history url\][\s\S]+?" HisNum "=(.*?)\r?\n", $)
  return $1
}

ZeroSupply(Num, NumDigit){
  StringLen, NumLen, Num
  LoopNum := NumDigit - NumLen
  Loop, %LoopNum%
    Num := 0 Num
  return, Num
}


[PR]
by LordNoesis | 2016-02-05 18:50 | テクノロジ | Trackback | Comments(0)

Windowsを遠隔操作するAndroidアプリをいくつか試してみた。

 外出先から自宅のWindows7機を遠隔操作したくて、有名処のAndroidアプリをいくつか試したメモ。

Chromeリモートデスクトップ -- 接続が簡単だが機能は貧弱。
RD Client -- Windowsのリモートデスクトップクライアントほぼそのまま。
VNC Viewer -- 普通のVNCクライアント。
TeamViewer -- 接続が簡単で一通りのことはできる。

Chromeリモートデスクトップ

 Google製。あらかじめPC側にChromeリモートデスクトップをインストールしておく必要がある(サーバーはサービスプロセス)。利用にはGoogleアカウントが必要だが、それによって一覧から対象PCを選択するだけで接続できる。WAN越えに特別な操作を必要としない。
 接続中は画面下にポップアップが出現し続ける。

 マウス入力はスワイプでポインタを動かして行う。ミドルクリック不可。ホイール(トリプルスワイプ)は敏感でちょっと使いにくい。
 キー入力はAndroidの入力そのままで補助がないため、ファンクションキー等を入力するにはBluetoothキーボードが必要。

 映像の更新頻度はまずまず。マルチモニタ対応(巨大なデスクトップとして表示)。
 音声転送には非対応。


 気軽に接続して、文字入力とマウスだけで完結する作業に向いてる。ログオンするとか、他の遠隔操作サーバー起動するとか。

RD Client

 Microsoft製。PC側でリモートデスクトップ接続を許可しておく必要がある(サーバーはサービスプロセス)。WAN越えには接続先のIPアドレスとポート解放が必要。利用ポートの変更はレジストリをいじる必要があるので、ルータで変換できないと面倒。諸々考慮するとVPN経由が楽かも。
 接続するとPC側はログオフした状態になる。

 マウス入力はスワイプでポインタを動かすモードと、タッチで直接操作するモードがある。ミドルクリック不可。
 キー入力はAndroidの入力に加え、ファンクション等が用意されたソフトウェアキーボードがある。

 映像の更新頻度は低い。マルチモニタ非対応。Aeroは解除される。
 音声転送は架空のオーディオデバイス経由。音質はまずまず。


 Windowsのリモートデスクトップクライアントほぼそのまま。AndroidでWindowsにログオンする(PC側はログオフする)のをどう考えるか。

VNC Viewer

 RealVNC製。PC側でVNCサーバーを起動しておく必要がある(今回はUltraVNCを使っている。サービス起動も可)。WAN越えには接続先のIPアドレスとポート解放が必要。通信の暗号化には有償版RealVNCが必要なので、無償でWAN越えするならVPN必須。
 サーバー側で、接続前に可否ダイアログを表示したり、接続数を制限することもできる。

 マウス入力はスワイプでポインタを動かして行う。マウス用ソフトウェアキーボードもある。
 キー入力はAndroidの入力に加え、ファンクション等が用意されたソフトウェアキーボードがある。ちゃんとAHKが入力に反応する。

 映像はサーバー設定による。更新間隔はまずまず。設定によってはGUI更新を検出できないことも。マルチモニタ非対応。
 音声転送非対応。


 普通のVNCクライアント。速度や映像関連の性質はサーバーにもよる。色数落とせば軽快だが、VPN必須なのをどう考えるか。

TeamViewer

 TeamViewer製。PC側でTeamViewerを起動しておく必要がある。利用にはアカウント登録か、接続先TeamViewerに表示されるIDとパスワードが必要。WAN越えに特別な操作を必要としない。
 接続中は画面右下にポップアップが表示され続ける。

 マウス入力はスワイプでポインタを動かして行う。ミドルクリック不可。Windows8以降ではマルチタッチ対応らしい。タブレット端末だとRDClientのようなタッチ操作もできるらしい。
 キー入力はAndroidの入力に加え、ファンクション等が用意されたソフトウェアキーボードがある。ちゃんとAHKが入力に反応する。

 映像は設定による。更新間隔はいまひとつで、GUI更新を検出できないことも(動画は問題ないっぽい)。マルチモニタ対応(モニタ切り替え)。
 音声転送に特別な操作は不用だが、音質は荒い。


 接続が簡単で、特殊キーにも対応し、音声転送も可能なので、迷ったらこれか? PC側で再生してる動画を見れなくもない。
 使い込んでないので、リモートデスクトップ以外の機能はわからん。


 総評は、うーん。簡易作業はChromeリモートデスクトップで、それ以外はVNCかなぁ。VPN構築済みでなければ、速度優先設定のTeamViewer。とにかくキビキビ動作し更新されるのが好きなんで。
 RDClientはタッチモードが便利なんだけど、Aeroやウィンドウ配置に影響あるのがなぁ。


[PR]
by LordNoesis | 2015-11-24 21:39 | テクノロジ | Trackback | Comments(0)

数値特化のリネームソフト、ZeroSuper ver.2.1.0公開。

 複数の数値に対応したゼロサプライ(ゼロパディング、ゼロフィル、ゼロ埋めとも)、ゼロサプレス、全角の英数字と一部記号の半角変換を行う、数値特化のリネームソフト「ZeroSuper」を更新。

 ZeroSuperがどんなものかは、以前書いた説明を見よう!

 ver.2.1.0ではコマンドラインオプションに対応。バッチ等から呼び出せば、ウィンドウを表示せずに処理することが可能になった。
 詳しい説明はReadme読んでもらうとして、例をあげると、ZeroSuper.exe /M2 "001.txt" "2.txt"とか、対象パスのリストを作っといてZeroSuper.exe /M2 /L "TargetList.txt"とかやればリネームされる。簡単。
 パス指定はワイルドカードも使えるので、通常のGUI操作より便利なこともあるかもだ。

 ただし注意がいくつか。
 まず、無効なパスは無視されるということ。/L "存在しないファイル" "001.txt"とした時、ZSerは001.txtをパスリストと認識してしまう。あとパスリストの文字コード(UTF-16)が間違っていると、無効なパスとしてすべて無視されるので、これも注意。
 それと、スイッチ(/から始まるやつ)は必ずパスより先に書くこと。パスより後だと、なんか読み取れんかった。

LORD PLAIN > software > ZeroSuper


[PR]
by LordNoesis | 2015-09-10 20:12 | テクノロジ | Trackback | Comments(0)

数値特化のリネームソフト、ZeroSuper ver.2.0.0公開。

 複数の数値に対応したゼロサプライ(ゼロパディング、ゼロフィル、ゼロ埋めとも)、ゼロサプレス、全角の英数字と一部記号の半角変換を行う、数値特化のリネームソフト「ZeroSuper」を2年ぶりに更新!

 そもそもZeroSuperってなんぞや?というと、ファイル/フォルダ名に含まれる複数の数値(半角数字がひとつ以上連続したもの)を比較し、ゼロサプライするソフト。数値は出現順にIDが割り当てられ、すべての対象ファイル/フォルダ名の同一IDの数値と比較され、ゼロサプライされる。
 例えば、[2015-06-05]と[平成27年6月5日]をゼロサプライすると、後者が[平成0027年06月05日]になる。ゼロサプレス→ゼロサプライすると、前者が[2015-6-5]になる。

 今はどうだか知らないが、開発当時は複数の数値に対応しているだけでも珍しかった。

 今回リリースされたver.2.0.0と、ver.1.1.0との違いは以下の通り。

  • Unicodeに対応
  • 実行ログをウィンドウに表示するように
  • 設定ツールを本体機能として取り込み
  • フォルダの再帰処理に対応(フォルダ自体でなく、フォルダ内のファイルをリネーム対象に)
  • 数値の出現順(ID)を無視した処理に対応(すべての数値を比較したゼロサプライに対応)
  • 完了時の通知に対応(ダイアログ or バルーン)
  • 実行ログの保存方法の変更に対応(出力しない or 毎回別のファイルに出力 or ひとつのファイルに上書き)

 AHKでいちから作り直したもんだから、まだバグが含まれている可能性もあるので、とにかく自己責任で。

c0031643_1923367.png

c0031643_19235862.png

LORD PLAIN > software > ZeroSuper


[PR]
by LordNoesis | 2015-06-05 18:53 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、標準出力を得る方法。

 新しいの

 AHKでCUIアプリの吐く標準出力を得る方法が分からんかったので調べたらフォーラムにあったのでメモ。

 日本語環境用にラスト1行だけ書き換えた。

; http://www.autohotkey.com/board/topic/15455-stdouttovar/page-8#entry540600

MsgBox % sOutput := StdoutToVar_CreateProcess("tasklist /s " A_ComputerName)

StdoutToVar_CreateProcess(sCmd, bStream = False, sDir = "", sInput = "") {
  DllCall("CreatePipe", "UintP", hStdInRd , "UintP", hStdInWr , "Uint", 0, "Uint", 0)
  DllCall("CreatePipe", "UintP", hStdOutRd, "UintP", hStdOutWr, "Uint", 0, "Uint", 0)
  DllCall("SetHandleInformation", "Uint", hStdInRd , "Uint", 1, "Uint", 1)
  DllCall("SetHandleInformation", "Uint", hStdOutWr, "Uint", 1, "Uint", 1)
  VarSetCapacity(pi, 16, 0)
  NumPut(VarSetCapacity(si, 68, 0), si)  ; size of si
  NumPut(0x100 , si, 44)      ; STARTF_USESTDHANDLES
  NumPut(hStdInRd , si, 56)    ; hStdInput
  NumPut(hStdOutWr, si, 60)    ; hStdOutput
  NumPut(hStdOutWr, si, 64)    ; hStdError
  If Not DllCall("CreateProcess", "Uint", 0, "Uint", &sCmd, "Uint", 0, "Uint", 0, "int", True, "Uint", 0x08000000, "Uint", 0, "Uint", sDir ? &sDir : 0, "Uint", &si, "Uint", &pi)  ; bInheritHandles and CREATE_NO_WINDOW
    ExitApp
  DllCall("CloseHandle", "Uint", NumGet(pi,0))
  DllCall("CloseHandle", "Uint", NumGet(pi,4))
  DllCall("CloseHandle", "Uint", hStdOutWr)
  DllCall("CloseHandle", "Uint", hStdInRd)
  If sInput <>
  DllCall("WriteFile", "Uint", hStdInWr, "Uint", &sInput, "Uint", StrLen(sInput), "UintP", nSize, "Uint", 0)
  DllCall("CloseHandle", "Uint", hStdInWr)
  bStream ? (bAlloc:=DllCall("AllocConsole"),hCon:=DllCall("CreateFile","str","CON","Uint",0x40000000,"Uint",bAlloc ? 0 : 3,"Uint",0,"Uint",3,"Uint",0,"Uint",0)) : ""
  VarSetCapacity(sTemp, nTemp:=bStream ? 64-nTrim:=1 : 4095)
  Loop
    If DllCall("ReadFile", "Uint", hStdOutRd, "Uint", &sTemp, "Uint", nTemp, "UintP", nSize:=0, "Uint", 0)&&nSize
    {
      NumPut(0,sTemp,nSize,"Uchar"), VarSetCapacity(sTemp,-1), sOutput.=sTemp
      If bStream&&hCon+1
        Loop
          If RegExMatch(sOutput, "[^\n]*\n", sTrim, nTrim)
            DllCall("WriteFile", "Uint", hCon, "Uint", &sTrim, "Uint", StrLen(sTrim), "UintP", nSize:=0, "Uint", 0)&&nSize ? nTrim+=nSize : ""
          Else Break
    }
    Else Break
  DllCall("CloseHandle", "Uint", hStdOutRd)
  bStream ? (DllCall("Sleep","Uint",1000),hCon+1 ? DllCall("CloseHandle","Uint",hCon) : "",bAlloc ? DllCall("FreeConsole") : "") : ""
  Return StrGet(&sOutput,"CP932")
}

 なんで探してたかって、es.exe(コマンドライン版Everything)をAHKから使いたかったんすよ。これでSearchResult := StdoutToVar_CreateProcess("es.exe 検索文字列")とかやれば超便利。

 例えば、以前書いたパスリストをX-Finderのクリップフォルダに変換するスクリプトと組み合わせるとか? テキスト介せばlist2xf.exeでも同じことできるけど。


[PR]
by lordnoesis | 2014-06-10 20:20 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる