Software」カテゴリーアーカイブ

PC関連のソフトウェアに関するカテゴリーです。

JScriptで使えるパス関連の文字列操作

WindowsにはWSH(Windows Script Host)というスクリプトが標準で搭載されています。WSHでは主にVBScriptかJScriptを使うと思いますが、今回はJScriptでのファイルパスに関連した文字列操作についてまとめてみようと思います。

ファイル名やドライブレターの抽出

サンプルとしてsampleを下のように定義し、fsoを作成します。

var sample = "c:\\aaa\\bbb\\jscript-sample.txt";
var fso = WScript.CreateObject("Scripting.FileSystemObject");

ベースネーム

WScript.Echo('GetBaseName: ' + fso.GetBaseName(sample));

実行結果

example

ドライブ名

WScript.Echo('GetDriveName: ' + fso.GetDriveName(sample));

実行結果

c:

拡張子

WScript.Echo('GetExtensionName: ' + fso.GetExtensionName(sample));

実行結果

txt

ファイル名

WScript.Echo('GetFileName: ' + fso.GetFileName(sample));

実行結果

sample.txt

親フォルダ

WScript.Echo('GetFileName: ' + fso.GetFileName(sample));

実行結果

sample.txt

パスの結合

WScript.Echo(fso.BuildPath('aa', 'bb'));
WScript.Echo(fso.BuildPath('aa\\', 'bb'));

実行結果

aa\bb
aa\bb

スクリプトのパスの取得

WScript.Echo(WScript.ScriptFullName);

実行結果

c:\jscript-sample.js

スクリプトのファイル名の取得

WScript.Echo(WScript.ScriptName);

実行結果

jscript-sample.js

スクリプトの実行

拡張子.jsで下記のようなテキストファイルを作成&実行(ダブルクリック)すると、次のようなダイアログが表示されます。

var sample = "c:\\aaa\\bbb\\jscript-sample.txt";
var fso = WScript.CreateObject("Scripting.FileSystemObject");

WScript.Echo('GetBaseName: ' + fso.GetBaseName(sample));

実行結果はc:\jscript-sample.jsという場所から実行した場合の結果です。

mount.davfs

このサイトはロリポップのレンタルサーバーを利用していますが、そのロリポップではWebDAVが利用できます。davfs2を使うとWebDAVを通常のファイルシステムのようにマウントして使えるので非常に便利です。注1

インストール

Gentoo Linuxを使っている場合はPortageを使ってインストールできます。他のディストリビューションを使っている場合も同様なパッケージ管理システムが利用できると思います。

emerge net-fs/davfs2

davfs2の設定

rootでマウントしてもいいと思いますが、一般ユーザーでマウントできるように設定してみました。

/etc/fstab

https://******.webdav-lolipop.jp/ /mnt/[マウントポイント] davfs user,noauto 0 0

******の部分はアカウントに合わせて変更します。

davfs2の使い方

$ mount /mnt/[マウントポイント]
Please enter the username to authenticate with server
https://******.webdav-lolipop.jp/ or hit enter for none.
  Username: ******
Please enter the password to authenticate user ****** with server
https://******.webdav-lolipop.jp/ or hit enter for none.
  Password:

ユーザー名とパスワードを聞かれます。ロリポップを使う場合は、ユーザー専用ページのアカウント情報より確認してください。

WebDAVhttps://.webdav-lolipop.jp/
FTP・WebDAVアカウント******

アンマウントも通常通りumountとできます。

$ umount /mnt/[マウントポイント]
/sbin/umount.davfs: waiting while mount.davfs (pid 31080) synchronizes the cache .. OK

ロリポップWebDAVの注意

詳しいことは分かりませんが、WebDAVにファイルを書き込めない問題注2があったのでdavfs2.confに以下の設定を追加しています。注3

/etc/davfs2/davfs2.conf

use_locks    0
if_match_bug 1

注1 CurlFtpFSを使うとFTPを使って通常のファイルシステム同様にマウントができます。WebDAV非対応のサーバーを利用している場合はこちらがおすすめです。

注2 cannot create regular file : File exists

注3 Box.comでも同じ状況になっているようです。

PythonでLibreOfficeのマクロ

LibreOfficeのマクロはLibreOffice BASICが標準ですが、Pythonを使ってマクロを書くこともできます。

LibreOffice Calcの簡単なサンプル

シートとセルを選択して値を読み書きするだけのスクリプトです。

def sample():

ここで定義する名前がLibreOffice Calc上でも表示されることになります。

doc = XSCRIPTCONTEXT.getDocument()

シートの選択

名前から選択する場合

sheet = doc.getSheets().getByName('Sheet1')

インデックスから選択する場合

sheet = doc.getSheets().getByIndex(0)

アクティブシートを選択する場合

sheet = doc.CurrentController.getActiveSheet()

値の読み書き(数値バージョン)

A1B1のセルの値を数字として読み取って、その値をC1に入力します。

# C1 = A1 + B1
A1 = sheet.getCellRangeByName('A1')
B1 = sheet.getCellRangeByName('B1')
C1 = sheet.getCellRangeByName('C1')
C1.Value = A1.Value + B1.Value

値の読み書き(文字列バージョン)

左上を(0,0)としたインデックスからセルを選択して、その値を文字列として扱います。

# C2 = A2 + B2
A2 = sheet.getCellByPosition(0, 1)
B2 = sheet.getCellByPosition(1, 1)
C2 = sheet.getCellByPosition(2, 1)
C2.String = A2.String + B2.String

指定したセルの値を読み書きするサンプルコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def sample():
  '''
  数値としてA1 + B1の値をC1に代入
  文字列としてA2 + B2の値をC2に代入
  '''

  doc = XSCRIPTCONTEXT.getDocument()

  # シートを選択
  #sheet = doc.getSheets().getByName('Sheet1')
  #sheet = doc.getSheets().getByIndex(0)
  sheet = doc.CurrentController.getActiveSheet()

  # C1 = A1 + B1
  A1 = sheet.getCellRangeByName('A1')
  B1 = sheet.getCellRangeByName('B1')
  C1 = sheet.getCellRangeByName('C1')
  C1.Value = A1.Value + B1.Value

  # C2 = A2 + B2
  A2 = sheet.getCellByPosition(0, 1)
  B2 = sheet.getCellByPosition(1, 1)
  C2 = sheet.getCellByPosition(2, 1)
  C2.String = A2.String + B2.String

実行結果