2022年5月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
無料ブログはココログ

« 2008年9月 | トップページ | 2008年11月 »

2008年10月31日 (金)

MHTMLファイルの名前の中の#!を全角に、シフトJIS以外の文字を{16進}に変える。

WSHのドロップハンドラが使えないので、VB.NETで作ります。

MhtFileName.exe ファイル...

vbc MhtFileName.VB

Imports System.IO

Public Class Class1
Public Shared Sub Main(Args() As String)
For Each Arg As String In Args
  Dim fi = New FileInfo(Arg)
  Dim xName As String = xString(fi.Name)
  If xName<>fi.Name Then fi.MoveTo(Arg + "\..\" + xName)
Next
End Sub

Private Shared Function xString(ByVal s As String) As String
Dim x As String = ""
For k As Integer = 1 To Len(s)
  Dim c = Mid(s, k, 1)
  If 31 < AscW(c) AndAlso AscW(c) < 128 Then
  ElseIf &Hff60 < AscW(c) And AscW(c) < &Hffa0 Then
  ElseIf Chr(Asc(c)) = c And Asc(c) < 0 Then
  Else
    c = Hex(AscW(c))
    c = "{" & New String("0"c, Len(c) Mod 2) & c & "}"
  End If
  x = x & c
Next
x = Replace(x, "#", "#")
x = Replace(x, "!", "!")
Return x
End Function
End Class

2008年10月30日 (木)

WSHのドロップハンドラは、ファイル名にシフトJIS以外の文字を通さない。(障害)

もし、ファイル名にシフトJIS以外の文字、例えば、®©などがあると、WSHのドロップハンドラは、その文字を通しません。

ちょうど、Chr(Asc(文字))したときのように、
®→R
©→c
似た文字がなければ→?

その結果、スクリプトからはドロップしたファイルが見つからないことになります。

一方、exeファイル用のドロップハンドラは、正しいようです。

ならば、WSHも、これで代替できればよいのでしょうが、WSHに使うとSFNになるので使えません。

まぁ、ファイル名には、シフトJIS内の文字を使うことです。

2008年10月29日 (水)

ファイル名にシフトJIS以外の文字があるか、バッチファイルで検出する。

デフォルトでは、ECHOのコンソール以外への出力は、シフトJISです。(cmd {/a|/u})

xFileName.cmd ファイルセット...

@echo off
for %%1 in (%*) do for /f "delims=" %%2 in ('echo "%%1"') do if not "%%~1"=="%%~2" echo %%1 & echo %%2

指定フォルダ以下を検索します。

xFileName.cmd フォルダ

@echo off
for /r %1 %%1 in (*) do for /f "delims=" %%2 in ('echo %%1') do if not "%%~nx1"=="%%~nx2" echo %%1 & echo %%2

2008年10月28日 (火)

MHTMLファイルの名前にシフトJIS以外の文字を使うと、MHTML扱いされなくなる?

もし、MHTMLファイルの名前にシフトJIS以外の文字、例えば、®©などがあると、拡張子を.htmに変えて、IEで開いたときのように、ぐちゃぐちゃに見えます。(XP SP3 + IE7.0)
これは、たぶんセキュリティ対策(フィッシング詐欺)なんでしょう。
URLにユーザが視認できそうにない文字を含む場合は、MHTML扱いしないようにしている?

まぁ、MHTMLファイルの名前には、シフトJIS内の文字を使うことです。

もし、MHTMLファイルを開いて、ぐちゃぐちゃになったら、ファイル名を変えて開き直せばよいでしょう。

MHTML扱いされてるかどうかは、Webページのプロパティでも確認できます。
プロトコル: 不明なプロトコル
種類: 使用不可
のようになってたら、MHTML扱いされています。

もし、
プロトコル: File Protocol
種類: MHTML Document
のようになってたら、MHTML扱いされてません。

IEオブジェクトのLocationURLを見ても、区別できます。
mhtml:file://C:\~~~.mht
file://C:\~~~.mht

※ なお、Vista+IE8では正常に見えます。

2008年10月27日 (月)

MHTMLファイルの名前に!を使うと、読み込めないことがある。

他にも、
「MHTMLファイルのファイル名に#があると、IEで開けない。(障害)」
http://scripting.cocolog-nifty.com/blog/2007/09/mhtmlie_8192.html
がありましたが、!もよくないようです。

!がmhtml:「MHTMLファイルへのURL」!「オリジナルの要素へのURL」というURLの構文記号であるせいだと思われます。

ファイル名に!があっても、ファイルに依って、読み込めるファイルもあれば、読み込み中のまま完了しないファイルもあります。
ちょっと試したところでは、ルートと構成要素が同じドメインだと駄目で、異なるとOKとか、Webページの構造に関係するようです。

まぁ、MHTMLファイルの名前には、!を使わないことです。!を削除するか、全角の!に変えるかですね。

2008年10月26日 (日)

ファイルのパス名をメモ帳に送るショートカット

以下のショートカットを作ります。
リンク先:cmd.exe /v:on /c for /l %n in (1,1,2) do if %n==2 ((for %q in (!x!) do @echo %q)>clip.txt&start notepad clip.txt) else set x=
作業フォルダ:作業ファイルclip.txtの置き場所。デスクトップなど。
ウィンドウの大きさ:最小化

これをSendToフォルダに置いて、(複数の)ファイルを送ると、メモ帳が開いてパス名のリストが得られます。

デスクトップに置いて、(複数の)ファイルをドロップしても同様です。

使っているのは、cmd.exeとメモ帳だけなので、どんな環境でも使えます。

2008年10月20日 (月)

コマンドラインで、フォルダとファイルを判別する。(その2)

簡単で確実なのは、属性をチェックすることです。

属性は、バッチ変数かFOR変数の%~a1で取り出せます。

drahs----

先頭のdをチェックします。

次のバッチファイルでは、環境変数の操作で先頭1文字を取り出します。

IsFolder.CMD フォルダかファイル

@ECHO OFF
SETLOCAL
SET A=%~a1
IF %A:~0,1%==d ECHO フォルダです。
IF %A:~0,1%==- ECHO ファイルです。

次のバッチファイルでは、FOR /F文のeol文字(行頭コメント文字)を利用します。

IsFolder.CMD フォルダかファイル

@ECHO OFF
FOR /F "eol=-" IN ("%~a1") DO ECHO フォルダです。
FOR /F "eol=d" IN ("%~a1") DO ECHO ファイルです。

また、バッチファイルの中では、

FOR %%1 IN ("フォルダかファイル") DO FOR /F "eol=-" IN ("%%~a1") DO ECHO フォルダです。

FOR %%1 IN ("フォルダかファイル") DO FOR /F "eol=d" IN ("%%~a1") DO ECHO ファイルです。

2008年10月19日 (日)

Where is where.exe ?

unix の which に相当するのは、Windows では whrere.exe です。

MS 純正の where.exe は、以下からダウンロードできます。

ftp://ftp.microsoft.com/reskit/y2kfix/x86/where.exe

which をバッチファイルで代替すると、

which.cmd ベース名.拡張子

@if exist "%~$PATH:1" echo;"%~$PATH:1"

この場合は、拡張子が省略できません。

拡張子を省略可にしたければ、環境変数のPATHEXTを使って、拡張子を補います。

which.cmd ベース名

@for %%1 in (%*) do @for %%2 in (.;%PATHEXT%) do @for %%3 in ("%%~1%%2") do @if exist "%%~$PATH:3" echo;"%%~$PATH:3"

GUIでは、
「新規作成」「ショートカット」
で、ベース名を与えれば、PATHで解決してくれます。
作成したショートカットのプロパティでリンク先を見ます。

WSHでも、同じ原理が利用できます。

which.vbs ベース名

Set wShell=CreateObject("WScript.Shell")
Set Link=wShell.CreateShortcut("hoge.lnk")
On Error Resume Next
Link.TargetPath=WScript.Arguments.Item(0)
On Error GoTo 0
WScript.Echo Link.TargetPath

2008年10月16日 (木)

「Windows 画像と Fax ビューア」でファイルを表示または印刷するショートカット

「Windows 画像と Fax ビューア」でファイルを表示するには、

rundll32.exe shimgvw.dll,ImageView_Fullscreen フルパス引用符なし

なので、普通には、ショートカットに書けません。

そこで、ワンライナテクを使って、

表示.lnk

cmd.exe /v:on /c for /l %n in (1,1,2) do if %n==2 (for %q in (!x!) do start rundll32.exe shimgvw.dll,ImageView_Fullscreen %~fq) else set x=

また、印刷するには、ファイル名の後にプリンタ名を指定する必要があり、

rundll32.exe shimgvw.dll,ImageView_PrintTo /pt フルパス引用符付き "プリンタ名"

なので、これも、普通には、ショートカットに書けません。そこで、

印刷.lnk

cmd.exe /v:on /c for /l %n in (1,1,2) do if %n==2 (for %q in (!x!) do start rundll32.exe shimgvw.dll,ImageView_PrintTo /pt "%~fq" "プリンタ名") else set x=

2008年10月 9日 (木)

全角ひらがな、全角カタカナの判別方法

全角ひらがな、全角カタカナを判別します。

Function [全角ひらがな](ByVal c)
c=AscW(c)
[全角ひらがな]=&H3041<=c And c<=&H3093
End Function

Function [全角カタカナ](ByVal c)
c=AscW(c)
[全角カタカナ]=&H30a1<=c And c<=&H30f6
End Function

2008年10月 8日 (水)

JIS非漢字、第一水準、第二水準の判別方法

JIS非漢字、第一水準、第二水準を判別します。

Function [非漢字](ByVal c)
[非漢字]=c=Chr(Asc(c))
If [非漢字] Then
  c=Asc(c)
  [非漢字]=&H8140<=c And c<=&H889e
End If
End Function

Function [第一水準](ByVal c)
[第一水準]=c=Chr(Asc(c))
If [第一水準] Then
  c=Asc(c)
  [第一水準]=&H889f<=c And c<=&H9872
End If
End Function

Function [第二水準](ByVal c)
[第二水準]=c=Chr(Asc(c))
If [第二水準] Then
  c=Asc(c)
  [第二水準]=&H989f<=c And c<=&Hea9e
End If
End Function

2008年10月 6日 (月)

ショートカットに書けるバッチワンライナーの作り方

バッチファイルにすると、アイコンやウィンドウサイズが変えられないし、ショートカットにするとバッチスクリプトが書けないし。。。

そこで、ショートカットに書けるバッチワンライナーの作り方です。

問題は、ドロップしたファイル名が行の末尾に付くのに、それらを行の前方のコマンドから扱えないことです。

そこで、for文とif else文で、行の前後の実行順序を逆転させます。

以下はドロップしたファイル名をechoする例です。

cmd.exe /v:on /k for /l %n in (1,1,2) do if %n==2 (for %q in (!x!) do echo %q) else set x=

次はclip.exeを利用してドロップしたファイル名をクリップボードにコピーします。

cmd.exe /c for /l %n in (1,1,2) do if %n==2 ((for %q in (%x%) do @echo %q)|clip) else set x=

2008年10月 5日 (日)

LeftA(文字列, バイト長)とMidA(文字列, 開始バイト位置, バイト長)関数を作る(VB.NET)

別のやり方で。

先にLeftA()を作り、MidA()はLeftA()を2回呼び出します。

Imports System.Text

Public Class Class1
Public Shared Sub Main()
MsgBox(MidA("abcdefg", 3, 2))
MsgBox(MidA("あいうefg", 3, 2))
MsgBox(MidA("あいうefg", 3, 3))
MsgBox(MidA("aいうefg", 3, 2))
MsgBox(MidA("aいうefg", 3, 3))
End Sub

Private Shared Function MidA(Str As String, bStart As Integer, bLength As Integer) As String
Str=LeftA(Str.Substring(LeftA(Str, bStart-1).Length), bLength)
Return Str
End Function

Private Shared Function LeftA(Str As String, bLength As Integer) As String
Dim enc As Encoding = Encoding.GetEncoding("Shift_JIS")
Dim bytes() As Byte = enc.GetBytes(Str)
If bytes.Length > bLength Then
  Str = Str.Substring(0, enc.GetString(bytes, 0, bLength).Length)
  If enc.GetByteCount(Str) > bLength Then Str = Str.Remove(Str.Length-1)
End If
Return Str
End Function
End Class

2008年10月 3日 (金)

MidA(文字列, 開始バイト位置, バイト長)関数を作る(VB.NET)

更に、VB.NETに焼き直し。

Public Class Class1
Public Shared Sub Main()
MsgBox(MidA("abcdefg", 3, 2))
MsgBox(MidA("あいうefg", 3, 2))
MsgBox(MidA("あいうefg", 3, 3))
MsgBox(MidA("aいうefg", 3, 2))
MsgBox(MidA("aいうefg", 3, 3))
End Sub

Private Shared Function MidA(Str As String, bStart As Integer, bLength As Integer) As String
Dim aStart As Integer = 0
Dim aLength As Integer = -1
Dim bPosition As Integer = 1
Dim aPosition As Integer
For aPosition = 1 To Len(Str)
  If aStart = 0 Then
    If bStart = bPosition Then
      aStart = aPosition
    ElseIf bStart < bPosition Then
      aStart = aPosition - 1
      bStart = bPosition - 2
    End If
  Else
    If bStart + bLength = bPosition Then
      aLength = aPosition - aStart
      Exit For
    ElseIf bStart + bLength < bPosition Then
      aLength = aPosition - aStart - 1
      bLength = bPosition - bStart - 2
      Exit For
    End If
  End If
  bPosition = bPosition + 1 - (Asc(Mid(Str, aPosition, 1)) < 0)
Next
If aStart Then
  If aLength = -1 Then
    aLength = aPosition - aStart
    bLength = bPosition - bStart
  End If
  MidA = Mid(Str, aStart, aLength)
End If
End Function
End Class

引数の位置と長さに、補正後の値を返してほしいときは、ByRefに変えてください。

2008年10月 2日 (木)

MidA(文字列, 開始バイト位置, バイト長)関数を作る(VBA)

VBAに焼き直し。

Sub a()
MsgBox MidA("abcdefg", 3, 2)
MsgBox MidA("あいうefg", 3, 2)
MsgBox MidA("あいうefg", 3, 3)
MsgBox MidA("aいうefg", 3, 2)
MsgBox MidA("aいうefg", 3, 3)
End Sub

Function MidA(Str As String, bStart As Long, bLength As Long) As String
Dim aStart As Long
Dim aLength As Long
Dim bPosition As Long
Dim aPosition As Long
aStart = 0
aLength = -1
bPosition = 1
For aPosition = 1 To Len(Str)
  If aStart = 0 Then
    If bStart = bPosition Then
      aStart = aPosition
    ElseIf bStart < bPosition Then
      aStart = aPosition - 1
      bStart = bPosition - 2
    End If
  Else
    If bStart + bLength = bPosition Then
      aLength = aPosition - aStart
      Exit For
    ElseIf bStart + bLength < bPosition Then
      aLength = aPosition - aStart - 1
      bLength = bPosition - bStart - 2
      Exit For
    End If
  End If
  bPosition = bPosition + 1 - (Asc(Mid(Str, aPosition, 1)) < 0)
Next
If aStart Then
  If aLength = -1 Then
    aLength = aPosition - aStart
    bLength = bPosition - bStart
  End If
  MidA = Mid(Str, aStart, aLength)
End If
End Function

引数の位置と長さは、補正後の値を返すように、ByRefにしています。

2008年10月 1日 (水)

MidA(文字列, 開始バイト位置, バイト長)関数を作る(VBScript)

Mid(文字列, 開始文字位置, 文字長)でもなく、
MidB(バイト列, 開始バイト位置, バイト長)でもない、
MidA(文字列, 開始バイト位置, バイト長)関数。

Unicode文字列からシフトJISコードでの開始バイト位置とバイト長で切り出します。
当然、2バイト文字の泣き分かれの可能性があるので、その場合は、1バイト前や、1バイト短くなります。

まず、VBScriptで、

MsgBox MidA("abcdefg",3,2)
MsgBox MidA("あいうefg",3,2)
MsgBox MidA("あいうefg",3,3)
MsgBox MidA("aいうefg",3,2)
MsgBox MidA("aいうefg",3,3)

Function MidA(Str,bStart,bLength)
Dim aStart,aLength,bPosition,aPosition
aStart=0
aLength=-1
bPosition=1
For aPosition=1 To Len(Str)
  If aStart=0 Then
    If bStart=bPosition Then
      aStart=aPosition
    ElseIf bStart<bPosition Then
      aStart=aPosition-1
      bStart=bPosition-2
    End If
  Else
    If bStart+bLength=bPosition Then
      aLength=aPosition-aStart
      Exit For
    ElseIf bStart+bLength<bPosition Then
      aLength=aPosition-aStart-1
      bLength=bPosition-bStart-2
      Exit For
    End If
  End If
  bPosition=bPosition+1-(Asc(Mid(Str,aPosition,1))<0)
Next
If aStart Then
  If aLength=-1 Then
    aLength=aPosition-aStart
    bLength=bPosition-bStart
  End If
  MidA=Mid(Str,aStart,aLength)
End If
End Function

引数の位置と長さは、補正後の値を返すように、ByRefにしています。

« 2008年9月 | トップページ | 2008年11月 »