たきるブログ

C#やOracleなどの情報を書いています。

【VBScript】ショートカットファイルを作成する

VBScriptを使って、バッチから特定のショートカットファイルを作成した場合などに有効。

下記の例では、受け取るパラメーターはこの通り。
ショートカットファイルのファイル名の拡張子はlnkまたはurlでなければならない。
また、作業フォルダは元ファイルのパスとなるようにしている。

No. 内容
1 元ファイルのパス C:\hoge
2 元ファイルのファイル名 元ファイル.xlsx
3 ショートカットファイルのパス D:\shortcut
4 ショートカットファイルのファイル名 ショートカットファイル.lnk

create_shortcut.vbs

Dim params
Dim sourcePath
Dim sourceFile
Dim targetPath
Dim targetFile

' コマンドライン引数を取得
Set params = Wscript.Arguments
If params.Count < 4 Then
   WScript.echo "コマンドライン引数が足りません"
   WScript.Quit
End If

sourcePath = params(0)
If Right(sourcePath, 1) <> "\" Then
    sourcePath = sourcePath & "\"
End If
sourceFile = params(1)
targetPath = params(2)
If Right(targetPath, 1) <> "\" Then
    targetPath = targetPath & "\"
End If
targetFile = params(3)


' ショートカットを作成
Dim objShell
Dim objShortCut
Set objShell = WScript.CreateObject("WScript.Shell")
Set objShortCut = objShell.CreateShortcut(targetPath & targetFile)
objShortCut.TargetPath = sourcePath & sourceFile
objShortCut.WorkingDirectory = sourcePath
objShortCut.Save

Set objShortCut = Nothing
Set objShell = Nothing

【バッチ】管理者権限があるかどうか確認する

openfiles コマンドが管理者権限を必要とすることを利用して、管理者権限があるかどうかを確認することができる。

openfiles > NUL 2>&1 
if %ERRORLEVEL% EQU 0 goto Main
echo 管理者権限で実行してください。
pause
exit

【TortoiseSVN】リポジトリの統合方法

いっつも忘れるので備忘録を。

-- 旧リポジトリからすべてダンプエクスポート
svnadmin dump D:\oldrepos > D:\oldrepos.dump

-- newreposにnewdirディレクトリを作成。

-- 新リポジトリのnewdirディレクトリ配下にダンプをインポート
svnadmin load D:\newrepos --parent-dir newdir < D:\oldpres.dump

oldpres
 ├ branches
 ├ tags
 └trunk

だった時、

newrepos
 └ newdir
   ├ branches
   ├ tags
   └ trunk

になる。
例えば、ユーザーのプロジェクト単位にリポジトリが存在していて、それを統合し、ユーザー単位にリポジトリをしたい時、有効だと思う。

リポジトリから特定のディレクトリのみ、新リポジトリに統合させたい場合は以下のようにする。

-- 旧リポジトリからtrunkのみダンプエクスポート
svnadmin dump D:\oldrepos | svndumpfilter include /trunk > D:\oldrepos.dump

-- newreposにnewdirディレクトリを作成。

-- 新リポジトリのnewdirディレクトリ配下にダンプをインポート
svnadmin load D:\newrepos --parent-dir newdir < D:\oldrepos.dump

svndumfilter include は、半角スペースで区切ることで複数ディレクトリを同時に指定可能。

【Oracle】数値をカンマ区切りにする

Oracleだけで数値をカンマ区切りにする。

TO_CHAR - オラクル・Oracle SQL 関数リファレンス

ここにあるように、TO_CHARでOracleでカンマ区切りをしようとすると、指定した書式の桁数を超過すると、『#########』のように結果が返ってきてしまう。
つまり、予め表示する最大桁数が分からないとダメということだ。

最大桁数が分からないため、フォーマットに『9G999G999G999G999G999G999G』のように、推測で、結果が超過しない書式を指定することになる。
そのため、万が一結果が超過したら、『##########################』という結果が返り、システムとしては宜しくない可能性を残してしまう。
更に言うと、そうなった時、書式を見直す必要が出てくる。

そこで、TO_CHARは使うんだけど、Oracleだけで数値を適切な桁数でカンマ区切りにする方法を編み出した。

-- 数値のカンマ編集化
SELECT
    TRIM(TO_CHAR(1000000000000, LPAD('999', 3 + (CEIL((LENGTH(1000000000000) - 3) / 3) * 4), '999G')))
  , TRIM(TO_CHAR(1000000000000.25, LPAD('999', 3 + (CEIL((LENGTH(TRUNC(1000000000000.25)) - 3) / 3) * 4), '999G') || 'D00'))
FROM
    DUAL

結果はこのようになる。

1,000,000,000,000     1,000,000,000,000.25

やってることは、指定された数値の桁数に応じて書式を生成しているだけ。
マイナス符号が入っていると、その分1組余計な書式を付与する可能性があるけど悪影響はないのでヨシとする感じ。
上記例では、小数部は2桁固定になっているが、ここはシステムが求める桁数に合わせる形になるだろう。

これは、案外重宝すると思う。
ただカンマ編集したいだけなのに、それをロジックでわざわざ書かなきゃいけないってのは案外面倒だしね。

Functionにするなどすれば、小数桁数の表現も変更可能だと思う。
でもこれにも欠点があって、OracleのNUMBER精度(11gでは38だった)を超えた数値の指定をすると正しい結果が得られない。

パッケージだとこんな感じ

CREATE OR REPLACE PACKAGE BODY PKG_NUMBER
IS
  /**
   * カンマ区切りにした数値文字列を取得します。
   * @param A_VALUE       数値
   * @param A_DECIMAL_NUM 小数桁数
   * @return カンマ区切りにした数値文字列
   */
  FUNCTION TO_FORMAT(A_VALUE NUMBER, A_DECIMAL_NUM NUMBER := 0)
  RETURN VARCHAR2
  IS
      L_DECIMAL_FORMAT VARCHAR2(100);
  
  BEGIN
    L_DECIMAL_FORMAT := '';
    IF A_DECIMAL_NUM > 0 THEN
      L_DECIMAL_FORMAT := 'D' || LPAD('0', A_DECIMAL_NUM, '0');
    END IF;
    
    RETURN TRIM(TO_CHAR(A_VALUE, LPAD('999', 3 + (CEIL((LENGTH(TRUNC(A_VALUE)) - 3) / 3) * 4), '999G') || L_DECIMAL_FORMAT));
  END;
  
END;
/

【C#】クラスをList化した状態で操作するには

大したことではないんだけど、ちょっとしたとこでなんだかんだでやりたくなる実装方法。

今回は、.NET Framework 2.0という古いバージョンでCSVを出力せねばならない。
CsvHelperが使えないので、自前で実装する必要があるんだけど、ごりごり書いてほしくない。(俺以外が開発することになった時に)

てことで、CSVの列項目インターフェースをちゃんと持って、それをCSV出力をしろよ、という感じの実装。

インターフェースや抽象クラスやらを使って必要な基本実装を作りこんでおけば、後は列項目インターフェースのクラスを用意して好きにしてくれって感じ。

まぁ、列順どうするんだって話もあるから、ちょろっと何とかすればいいだろ。
ColumnOrderAttributeクラスを用意した実装にするとか、CsvHelperのように順序とプロパティをマッピングさせるとか、やりようはあるだろうね。
今のとこ、出力さえできればいいからというのもあるかもしれないけど。

List Class Sample