ど忘れSEの備忘録

日々集めた何かしらを残すための何か。 共有とか疑問解決とかできたらいいな。 iPhoneとかiOSとかその他スクリプトとか色々。

batファイルでフォルダコピーとかショートカットとかを作りたかったお話

最近職場の変更管理フローが変更され、手間が多くなってきた。
元々1つのディレクトリで諸々管理していればよかったものを、構成管理の都合上別ファイルで管理することに。

◎変更前([ディレクトリ])
[開発用]
 ├[管理]
 │ ├ファイル
 │ └ファイル
 ├[成果物]
 │ ├ファイル
 │ └ファイル
 ├[試験仕様書]
 │ ├ファイル
 │ └ファイル
 └[レビュー指摘一覧]
   ├ファイル
   └ファイル

◎変更後([ディレクトリ])
[開発用]
 ├[管理]
 │ ├ファイル
 │ └ファイル
 └[成果物]
   ├ファイル
   └ファイル
[構成管理用]
 ├[試験仕様書]
 │ ├ファイル
 │ └ファイル
 └[レビュー指摘一覧]
   ├ファイル
   └ファイル

これを開発案件ごとに作成しなきゃならず、開発用ディレクトリ、構成管理用ディレクトリがまた離れたところにあるわけでめんどくさい。
なので、テンプレ用のディレクトリをそれぞれ用意しておき、開発用ディレクトリに試験仕様書とレビュー指摘一覧のショートカットを作成し、今まで通りの使い勝手で作業したいと思ったのが事の発端。
やりたいこととしては以下の2点。

ショートカットの作成はbatファイルだけでは不可能だったので、vbsとの合わせ技でなんとかする。

実行用.bat

@echo off

rem 定数宣言
set dirDev="\\案件\開発用\"
set dirChgMng="\\案件\構成管理用\"

rem 今日の日付を取得
set YYYYMMDD=%DATE:/=%

rem 課題表#、担当者、案件名の入力
:Input
set /P TaskNo="課題表#を入力してください: "
set /P Staff="担当者を入力してください: "
set /P ProjectTitle="案件名を入力してください: "
set dirName=(#%TaskNo%%YYYYMMDD%_%Staff%_%ProjectTitle%
echo 作成するディレクトリは%dirName%でよろしいですか?
echo "よろしければ「y」を入力してください。: "
set /P rslt="「y」以外を入力すると再入力できます。: "
if "%rslt%"=="y" (
  goto MainProc
) else if "%rslt%"=="Y" (
  goto MainProc
) else (
  goto Input
)

:MainProc
rem 開発用ディレクトリのコピー
xcopy /s /e /i %dirDev%\ディレクトリテンプレ_開発用 %dirDev%\%dirName%
rem 構成管理用ディレクトリのコピー
xcopy /s /e /i %dirDev%\ディレクトリテンプレ_構成管理用 %dirChgMng%\%dirName%

echo %dirDev%%dirName%
echo %dirChgMng%%dirName%

cscript %~dp0\ショートカット作成.vbs 試験仕様書 %dirChgMng%%dirName% %dirDev%%dirName%
cscript %~dp0\ショートカット作成.vbs レビュー指摘一覧 %dirChgMng%%dirName% %dirDev%%dirName%

ショートカット作成.vbs

' 引数
' ショートカット名
' リンク作成元
' リンク作成先

Set ws = CreateObject("WScript.Shell")

dim scFileName :scFileName = WScript.Arguments(0)
dim linkMoto   :linkMoto   = WScript.Arguments(1)
dim linkSaki   :linkSaki   = WScript.Arguments(2)

' ショートカット作成
WScript.Echo linkSaki + "\" + scFileName + ".lnk"
Set shortcut = ws.CreateShortcut(linkSaki + "\" + scFileName + ".lnk")
With shortcut
    .TargetPath = linkMoto + "\" + scFileName
    .Save
End With

batに関しては、xcopyコマンドでテンプレ用のディレクトリをまるっと別名でコピーするだけ。

/I 指定されたコピー先が存在せず、コピーするファイルが複数の場合、
コピー先をディレクトリとしてコピーします。
/E ディレクトリまたはサブディレクトリが空であってもコピーします。
"/S /E" と同じ意味です。/T の内容を変更する際にも使用できます。
/S 空の場合を除いて、ディレクトリとサブディレクトリをコピーします。

これでコピー先のディレクトリが無い場合に自動で作ってくれる。
ただし、

xcopy \\ディレクトリテンプレ_開発用\管理 A案件

みたいな書き方をすると、A案件配下に管理配下のファイルがコピーされるだけ。
きっちり

xcopy \\ディレクトリテンプレ_開発用\管理 A案件\管理

と、コピー先のディレクトリも指定してあげなきゃいけないので注意。

vbs側はWindowsシェルを用いる。
CreateShortcutでショートカット作成先のオブジェクトを作成。
末尾は「.lnk」じゃないと受け付けてもらえない。
あとはこのオブジェクトに対してTargetPathを指定しSaveしてあげればショートカットの完成。
プロパティは他にもあるみたいだけど最低限これだけあれば動く。

小口案件がやたら多いから、これでちょっとは業務効率化できる…はず。