2016年6月30日木曜日

社内webにアップロードするファイルからネットワークドライブ上のファイルにリンクする

先日「ドラッグ&ドロップされたファイルからハイパーリンクを作成する」というサンプルを作成しましたが、このサンプルが出力したPathが使えるのは「コマンドを指定して実行」画面や


エクスプローラのアドレスバーなどです。



サンプルで作成したハイパーリンクをWordファイルなどに貼りつけることは可能ですが、そのWordファイルが「http://~」で始まるアドレスに移動した場合、そのリンクは無効になってしまいます。



「http://~」で始まるアドレスに移動する場合は、ハイパーリンクのリンク先アドレスを少し変える必要があります。




具体的には以下のようにすれば良いです。

リンク先: \\PC名\app\aaa.txt      ←これでは開けない
リンク先: file:///\\PC名\app\aaa.txt  ←これなら開ける


まず、リンク先が「\\PC名\app\aaa.txt」の状態で、ファイルをwebサーバにアップロードして、そのファイルを開いてみるとリンク先は「http://~~~~/~~~/\\PC名\app\aaa,txt」のようになってしまいます。



しかしリンク先文字列が「file:///」から始まっている場合は、webサーバにアップロードしてから開いた場合も「file:///~」というアドレスにリンクされることになります。

「アドレス」が「file:///~」なら


ファイルをwebサーバにアップロードした後も、リンク先は「file:///~」になっている。



以下、サンプル
<job>
<script>
arg = WScript.Arguments, L=arg.length
// 引数がなければ終了する
if(!L){
WScript.Echo('WSFファイルに、ファイルかフォルダをドラッグ&ドロップしてください')
WScript.Quit()
}
fs = new ActiveXObject('Scripting.FileSystemObject')
shell = new ActiveXObject('WScript.Shell')
WshNetwork = WScript.CreateObject("WScript.Network")
// ネットワークドライブのドライブ文字vsネットワークパスの組み合わせを取得する
drives = WshNetwork.EnumNetworkDrives()
objDrive={}
for(var i=0,L=drives.length;i<L;i+=2){
objDrive[drives.Item(i)] = drives.Item(i+1)
}
getPathUNC = function(p){
if(unc = objDrive[fs.GetDriveName(p)]){
return unc + p.replace(/^[A-Z]:/,'')
}else{
return 共有(p)
}
}
// 共有設定しているフォルダ内のファイルにも対応する
arr共有=[]
objEnum = new Enumerator(WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer().ExecQuery("Select * From Win32_Share"))
for(i=0; !objEnum.atEnd() ;objEnum.moveNext()){
item = objEnum.item()
if(!item.path){continue} // IPC$はpath無いので何にでもマッチしてしまう
arr共有[i++] = {path:item.path, name:item.name}
}
arr共有len = arr共有.length
reg = /[\\\/]$/
共有=function(path){
for(var i=0;i<arr共有len;i++){
// index=0以外は無視
if(path.indexOf(arr共有[i].path)){continue}
var head='\\\\'+WshNetwork.computerName+'\\'+arr共有[i].name
return head+(head.match(reg)?'':'\\')+path.slice(arr共有[i].path.length, path.length)
}
return path
}
str = ''
for(i=0,L=arg.length;i<L;i++){
path = getPathUNC(arg(i))
// 2016/10/27 下記URLのページを参考にして使用禁止文字の種類を追加(丸かっこはOKなのかNGなのかよく分からないが、実際のところ使えるようなので、ここでは無視する)
// https://www.ipentec.com/document/document.aspx?page=web-url-invalid-char
if(path.match(/([<>#"%\{\}|^\[\]\'])/)){
// URLでの使用禁止文字が含まれている場合、リンクにできない。
str += '下記URLは「'+RegExp.$1+'」を含んでいるため、リンクできません。<br>'+path+'<br><br>'
}else{
// 円マークやスペースのエスケープはしなくても良いっぽい(動作した)
// 先頭に「file:///」を追加するだけにする。
// 2016/10/27 PC名に「-」が含まれている場合を考慮して[\w]を[-\w]に変更した。
path = path.replace(/\//g,'\\').replace(/^(\\\\[-\w]+\\)/,'file:///$1')
// リンクを追加する。
str += '<a href="'+path+'">'+path+'</a><br><br>'
}
}
ヘッダー = [
'<html><title>リンク作成</title><'+'script>',
'onload=function(){resizeTo(tbl.offsetWidth+60, tbl.offsetHeight+60)}',
'<'+'/script><body><table id=tbl><td>'
].join('\r\n')
フッター = '</td></table></body></html>'
path = fs.GetSpecialFolder(2)+'/リンク作成.hta'
with(fs.CreateTextFile(path)){
Write(ヘッダー+str+フッター)
Close()
}
shell.run(path, 1, true)
// 多重起動した場合は先に閉じられたヤツで削除されるので、ファイルの有無を判定する。
if(fs.FileExists(path)){fs.DeleteFile(path)}
</script>
</job>

0 件のコメント:

コメントを投稿