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        
無料ブログはココログ

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

2006年10月29日 (日)

コマンドプロンプトのカレントディレクトリを、エクスプローラで開いているフォルダに変更する。

コマンドプロンプトのカレントディレクトリを、そのときエクスプローラで開いているフォルダに変更するには、
コマンドプロンプトで、CD(空白)を入力した後に、フォルダをドロップして、エンターとか、しますが。。。

それを、もっと簡単にするバッチファイル。

EXCD.CMD

@if(0)==(0) ECHO OFF
FOR /F "delims=" %%0 IN ('CScript.exe //NoLogo /E:JScript "%~f0"') DO CD /D "%%0"
GOTO :EOF
@end
WScript.Echo(new ActiveXObject('Shell.Application').Windows().Item().Document.Folder.Self.Path);

コマンドプロンプトで、デスクトップなどのディレクトリに簡単に移動する。

エクスプローラでは、アドレスバーにshell:desktopと入れることで、
簡単にデスクトップなどのシェル スペシャル フォルダに移動できます。

同様に、コマンドプロンプトで、以下のバッチファイルを使用すると、
shell
shell desktop
shell desktopfolder
で、デスクトップに移動します。

shell.cmd

@if(0)==(0) ECHO OFF
IF "%~1"=="" SET CD="shell:desktop"
IF NOT "%~1"=="" SET CD="shell:%~1"
IF NOT "%~2"=="" SET CD="shell:%*"
FOR /F "delims=" %%0 IN ('CScript.exe //NoLogo /E:JScript "%~f0" %CD%') DO CD /D "%%0"
SET CD=
GOTO :EOF
@end
WScript.Echo(new ActiveXObject('Shell.Application').NameSpace(WScript.Arguments.Item(0)).Self.Path);

使用法
shell [special folder]
で、shell:special folderのフォルダに移動します。

参考 Shell Special Folder
shell:DesktopFolder
shell:Programs
shell:Personal
shell:Favorites
shell:Startup
shell:Recent
shell:SendTo
shell:Start Menu
shell:Desktop
shell:Fonts
shell:NetHood
shell:Templates
shell:Common Start Menu
shell:Common Programs
shell:Common Startup
shell:Common Desktop
shell:AppData
shell:PrintHood
shell:Local AppData
shell:Common Favorites
shell:Cache
shell:Cookies
shell:History
shell:Common AppData
shell:Windows
shell:System
shell:ProgramFiles
shell:My Pictures
shell:Profile
shell:SystemX86
shell:Administrative Tools
shell:Common Administrative Tools
shell:CommonProgramFiles
shell:Common Documents
shell:Common Templates

以下には移動できません。
shell:InternetFolder
shell:ControlPanelFolder
shell:PrintersFolder
shell:RecycleBinFolder
shell:DriveFolder
shell:NetworkFolder
shell:ConnectionsFolder

短い名前に変わったプロンプトを長い名前に戻す。

コマンドプロンプトで、16ビットアプリを呼び出すと、プロンプト文字列が短い名前に変わります。
以下のバッチファイルは、プロンプト文字列を元の長い名前に戻します。

LCD.CMD

@if(0)==(0) ECHO OFF
FOR /F "delims=" %%0 IN ('CScript.exe //NoLogo /E:JScript "%~f0" %CD%') DO CD /D "%%0"
GOTO :EOF
@end
WScript.Echo(new ActiveXObject('Shell.Application').NameSpace(WScript.Arguments.Item(0)).Self.Path);

2006年10月27日 (金)

SETLOCAL ~ ENDLOCAL内部の環境変数をエクスポートする。

SETLOCAL ~ ENDLOCAL内部の環境変数の一部を外部に持ち出したいとき、どうするか?

バッチファイル内で、遅延展開が必要で、
SETLOCAL ENABLEDELAYEDEXPANSION
を使用すると、今度は、環境変数がバッチ外部に持ち出せなくなります。

SETLOCAL ENABLEDELAYEDEXPANSION
SET X=AAA
(
ENDLOCAL
SET X=%X%
)
ECHO %X%

2006年10月25日 (水)

clip.exeで「Send To Clipboard as Name」を作る。

Windows 2003 Serverには、標準で、clip.exeが入っています。
Windows XPなどは、リソースキットを買うか、Windows 98 Resource Kit からもダウンロードできます。

以下のようなバッチファイルを作ります。

Send To Clipboard as Name.CMD

@ECHO %* | CLIP.EXE

または、

@(FOR %%0 IN (%*) DO @ECHO %%0) | CLIP.EXE

前者は空白区切り、後者は改行区切りです。

短い名前にしたければ、

@(FOR %%0 IN (%*) DO @ECHO %%~s0) | CLIP.EXE

ファイル名だけにしたければ、

@(FOR %%0 IN (%*) DO @ECHO %%~nx0) | CLIP.EXE

空のダミーファイルと関連付けでやる方法もあります。

Send To Clipboard as Name.NameOnClipboard
というサイズ0のファイルを作ります。

拡張子.NameOnClipboardに関連付けます。

[HKEY_CLASSES_ROOT\.NameOnClipboard\Shell\Open\Command]
@="CMD.EXE /C,(FOR %%0 IN (%*) DO @ECHO %%0) | CLIP.EXE"

[HKEY_CLASSES_ROOT\.NameOnClipboard\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

WSHのドロップハンドラを流用します。

2006年10月24日 (火)

フルパス名から親フォルダパス名を取り出す簡便な方法。

パス名のノーテーション\..\を使用すると、他の方法より遥かに簡便です。

一般的な方法(使用前)

バッチファイルやスクリプトファイルのフルパス名から親フォルダパス名を取り出す。

[バッチファイル]

"%~dp0"

[VBScript]

Set fso=CreateObject("Scripting.FileSystemObject")
fso.GetParentFolderName(WScript.ScriptFullName)

Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))

バッチファイルやスクリプトファイルと同じフォルダのファイルのフルパス名を組み立てる。

[バッチファイル]

"%~dp0ファイル名"

[VBScript]

Set fso=CreateObject("Scripting.FileSystemObject")
fso.GetParentFolderName(WScript.ScriptFullName)
fso.BuildPath(fso.GetParentFolderName(WScript.ScriptFullName),"ファイル名")

Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))&"ファイル名"

簡便な方法(使用後)

バッチファイルやスクリプトファイルのフルパス名から親フォルダパス名を取り出す。

[バッチファイル]

"%~0\..\"

[VBScript]

WScript.ScriptFullName&"\..\"

バッチファイルやスクリプトファイルと同じフォルダのファイルのフルパス名を組み立てる。

[バッチファイル]

"%~0\..\ファイル名"

[VBScript]

WScript.ScriptFullName&"\..\ファイル名"

純正のclip.exe、choice.exe、forfiles.exe、sleep.exeの入手先

Windows 98 Resource Kit

clip.exe

choice.exe

forfiles.exe

sleep.exe

Windows 98なので、tail.exeはありません。

「ファイルやフォルダの検索」が[ファイルに含まれる単語または句]を検索しない?

WIndows XPでは、すべてのファイルが検索される訳ではなく、拡張子によって、
検索されたり、されなかったり、検索されても、検索の仕方が違ってたりします。

検索対象になる拡張子は、
HKCR\.拡張子\PersistentHandlerキーがあるものです。
しかも、その検索方法は、その@値が以下のどれかに依ります。

{098f2470-bae0-11cd-b579-08002b30bfeb} Null persistent handler
{eec97550-47a9-11cf-b952-00aa0051fe20} HTML File persistent handler
{5e941d80-bf96-11cd-b579-08002b30bfeb} Plain Text persistent handler
{98de59a0-d175-11cd-a7bd-00006b827d94} Microsoft Office Persistent Handler
{5645C8C2-E277-11CF-8FDA-00AA00A14F93} MIME File persistent handler

Nullは、検索しないようです。

HTML Fileは、タイトルなどは検索するようですが、
タグ内やコメント、スクリプトなどを検索しないようです。

なので、この2つの値を持つ拡張子については、
必要に応じて、その値をPlain TextのCLSIDに変えてやるとよいようです。
たくさんあって面倒ですが。。。

また、PersistentHandlerキーのない拡張子は、標準状態では検索されません。
これを検索対象とするには、
HKLM\SYSTEM\CurrentControlSet\Control\ContentIndexキーのDWORD値
FilterFilesWithUnknownExtensions を 1 に変更します。

このようにしておけば、前述の@値をPlain TextのCLSIDに変える代わりに、
HKCR\.拡張子\PersistentHandlerキーを削除しても同じです。

KB309173 - "ファイルに含まれる単語または句" 検索条件が機能しない

KB309447 - [ファイルに含まれる単語または句] の検索で、指定した文字列が一部のファイルの種類に対して検索されない

※ レジストリ変更後に起動されたExplorer/IEプロセスから変更が有効になります。

2006年10月22日 (日)

コマンドラインで、引数中に二重引用符を含める方法は?

コマンドラインで、引数中に空白を含めるときは、引数を二重引用符で囲め、と書いてあります。
しかし、引数中に二重引用符を含める方法は、書いてません。不明です。

しかし、安全に、引数中に二重引用符を含めるには、引数を二重引用符で囲み、
引数中の二重引用符を1個につき2個、つまり2倍個数、書く。以外にありません。

以下のようなバッチファイルを作って、引数をいろいろ指定してみてください。
FOR %%0 IN (%*) DO ECHO %%0

ARGS.CMD 引数...

VBScriptで文字列中の二重引用符のエスケープの仕方が何処に書いてあるか。

VBScriptの文字列リテラルは、二重引用符で囲みますが、
その中で二重引用符を書くときは、どうエスケープするか?

一個の二重引用符につき2個二重引用符を書く。つまり2倍個数にします。

これは常識的な仕様ですが、いざ、その仕様記述を見つけようとすると、ありません。

結局、VBの仕様を借用するしかないでしょう。

Visual Basic における文字列の基本

2006年10月19日 (木)

非表示のアプリを表示したり、コマンドラインを区別してプロセスを終了させる。

スクリプトやHTAを作成していると、テスト中に、非表示のアプリが残ります。

IEやエクスプローラ、WordやExcelのオブジェクトが非表示で残ることもあります。

これらをタスクマネジャで終了させようとしても、同じアプリが複数動いていると区別が出来ません。

そういうときによく使うもの。

IE/エクスプローラの再表示や終了などは、MenuBar.HTA
メニューバーのないIEにメニューバーを表示したり、非表示のIEを表示するHTA

その他、一般のアプリの終了は、TaskKill.HTA
プロセス情報を一覧表示し、その中からプロセスを強制終了するHTA

もし、Word2003があれば、
その他、一般のアプリの再表示や終了などは、WordTasks.HTA
Word2003を使用してタスクの一覧、ウィンドウ表示/非表示などを操作するHTA

2006年10月17日 (火)

環境変数は一般的に遅延展開を使うべし。

一般のスクリプト言語では、変数の値によって構文エラーになったりしませんが、
バッチファイルでは、
%変数%の値にシェルの特殊文字<|>(&)"や構文のキーワードが含まれていると、
構文エラーになったり、意図しない処理に変わったり、します。
%変数%は、Eval()みたいなもんです。

ところが、遅延展開の!変数!は、一般のスクリプト言語の変数のように使えます。

なので、環境変数は、原則として、遅延展開を用いることにしましょう。

Eval()みたいな用途のときだけ、例外として、%変数%を使いましょう。

バッチファイル、コンソールアプリなどを非表示で実行する。

バッチファイルやコンソールアプリのコンソールウィンドウが鬱陶しいときは、
START /MINやショートカットのプロパティで「実行時の大きさ」で最小化すればよいのですが、
それでもタスクバーのアイコンが鬱陶しかったら?

WindowStyle=0(ウィンドウ非表示)が指定できる、
WScript.ShellのRun()や
Shell.ApplicationのShellExecute()
で起動すればよいのです。

非表示実行.CMD コマンドライン

@if(0)==(0) ECHO OFF
SETLOCAL
SET X=%*
CScript.exe //NoLogo //E:JScript "%~f0" "%X:"=`%"
GOTO :EOF
@end
new ActiveXObject('WScript.Shell').Run(WScript.Arguments.Item(0).replace(/`/g,'"'),0);

バッチファイルでファイルを読む方法(その2)

「ファイルの全行を読む。」

× FOR /F %%0 IN (ファイル) DO ECHO %%0

※ 行の一部(第1トークン)しか読めない。

× FOR /F "tokens=*" %%0 IN (ファイル) DO ECHO %%0

※ 行の先行空白が読めない。

× FOR /F "delims=" %%0 IN (ファイル) DO ECHO %%0

※ 空行が読めない。

× FOR /F "delims=[] tokens=1*" %%1 IN ('FIND /N /V "" ^<ファイル') DO ECHO;%%2

※ FINDで行番号[n]を付けて、[と]を区切文字にして、第2トークンを取り出す。
※ 'FIND /N /V "" ファイル'だと、先頭に'---------- ファイル'という行が付く。
※ 行番号nは%%1で取り出せます。
※ 空のとき、「ECHO は <ON> です。」が出ないよう、ECHO;←区切文字を入れる。
※ 行頭に、[や]があると消えるので、駄目ですね。

○  SETLOCAL ENABLEDELAYEDEXPANSION
   FOR /F "delims=" %%0 IN ('FIND /N /V "" ^<ファイル') DO (
    SET L=%%0
    SET N=!L:~1!
    SET /A N=N
    ECHO;!L! !L:*]=!

※ [n]行本体 から*]を削除すると行本体が得られます。
※ n]行本体 をSET /Aで代入すると行番号が得られます。
※ FOR /F "delims=[]" %%1 IN ("%%0") DO ECHO;%%1 としても行番号が得られます。

純正のforfiles.exeを使おう。

unixのfindコマンドに相当するものが、Windowsでは、forfiles.exeです。

forfiles.exeは、Windows 2003 Serverには標準で付いてるようですが、
他はリソースキットにしかないようです。

Windows 2000 Resource Kitのものが、ここからダウンロードできるようです。

しかし、Windows 2000 Resource Kitのものはシンタクスがちょっと変です。
forfiles.exeの仕様は、実際のforfiles(ENTER)で確認してください。
ドキュメントと異なることがあります。

Windows 98 Resource Kitのものは、ここからダウンロードできます。
こっちのほうがWindows 2000のものよりまともなようです。

一方、find.exeは、準 純正品がSFUに入ってます。
Services for UNIX 3.5 ホーム

2006年10月16日 (月)

純正のtail.exeの入手先

純正のtail.exeがあります。
Windows Server 2003 Resource Kit Tools

"C:\Program Files\Windows Resource Kits\Tools\tail.exe" /?
usage: TAIL [switches] [filename]*
   switches: [-?] display this message
             [-n] display last n lines of each file (default 10)
             [-f filename] keep checking filename for new lines

準 純正のtail.exeもあります。
Services for UNIX 3.5 ホーム

Usage: tail [-f] [-b|c|k|l|m|n [+-]number] [file]
       tail -[number][b|c|k|l|m|n][f] [file]
       tail +[number][b|c|k|l|m|n][f] [file]

ただし、SFUは、XP Home Editionにインストールできません。

同様に、SFUには、tee.exeもあります。しかし、tee.exeの純正品は無いようです。

バッチファイルで日付の簡易計算法

次のサンプルは最終更新日付が6箇月以前のものを表示します。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET d=!DATE!
SET /A x=!d:~-10,4!*12*31+1!d:~-5,2!*31+1!d:~-2,2!
SET /A x=x-6*31
FOR %%0 IN ( * ) DO (
SET d=%%~t0
SET /A y=!d:~0,4!*12*31+1!d:~5,2!*31+1!d:~8,2!
IF !y! LSS !x! ECHO %%0
)

1年=12月
1月=31日
で単純に計算します。

月、日が0で始まると、8進数になるので、100を付けます。

コマンドラインヘルプの所在

コマンドプロンプトのヘルプでは、リダイレクションの記事が見つかりません。
しかし、何処にも無い訳ではなく、GUIのヘルプにあります。

コマンド リダイレクト演算子を使用する
hh.exe ms-its:ntcmds.chm::/redirection.htm

また、コマンドラインヘルプのGUI版もあります。

コマンド ライン リファレンス
hh.exe ms-its:ntcmds.chm::/ntcmds.htm

また、Windows XP ヘルプを「ヘルプとサポートセンタ」ではなく、
従来の「HTMLヘルプ(hh.exe)」で開きます。
hh.exe windows.chm
左側のタブ「キーワード」「検索」「お気に入り」や上部のメニューバーが表示されます。
ここで、タイトルバーのアイコンを右クリックしてコントロールメニューを開き、
URLへ移動から
ms-its:ntcmds.chm::/ntcmds.htm
を入力して、これを「お気に入り」タブで「追加」しておくと、次から楽でしょう。

ヘルプとサポート センタで開くこともできます。
start helpctr.exe /URL ms-its:ntcmds.chm::/ntcmds_o.htm
これを右クリックして「お気に入りに追加」しておくと、次から楽でしょう。

ヘルプとサポートで「"コマンド ライン リファレンス"」で検索して、
「コマンド ラインから Telnet を管理する」などから、
「コマンド ライン リファレンス」をクリックしてもよいでしょう。
或いは、ヘルプとサポートで「Dir」で検索して、
その「関連項目」から「コマンド ライン リファレンス」を選んでもよいでしょう。

2006年10月15日 (日)

時代遅れのメーラで読めないUTF-8メールを読む。

クラシックなメーラを使っていて、
UTF-7、UTF-8、UTF-8+Quoted Printable、UTF-8+BASE64などで送られて来たメールが読めないときは、
そのメールを取り出して、拡張子を.mhtmlに変えると、IEで開いて読めます。

ただし、拡張子を.mhtmlに変えるときは、セキュリティ上のリスクを伴うので、信頼できるメールに限ります。
もし、Content-Location:行があると、それはセキュリティゾーン偽装の可能性があります。

UTF-7、UTF-8なら、拡張子を.txtに変えても、IEで開いて読めます。

UTF-8なら、メモ帳でも読めます。

「ファイルを開く」「名前を付けて保存」ダイアログの初期表示を「縮小版」にする。

「ファイルを開く」「名前を付けて保存」ダイアログの表示の初期値は「一覧」です。
後から表示メニューを操作すれば「縮小版」に変更できますが、
初期状態から「縮小版」にするのは一般的には困難です。

しかし、「マイ ドキュメント」フォルダの「マイ ピクチャ」フォルダだけは、
最初から「縮小版」で表示されます。

なので、ダイアログを「縮小版」で開きたいフォルダは、
「マイ ピクチャ」フォルダのサブフォルダにするとよいでしょう。

関連付けのコマンドラインに、%Sを指定すると、そこに、WindowStyleが入ります。

これを利用すると、WindowStyleの指定をコマンド引数で受け取ることができます。

そうやって調べてみたところ、

ダブルクリック 1
ドロップ 5
CMD.EXE /C 1
START /MIN 7
START /MAX 3
wShell.Run 1 デフォルト

でした。

2006年10月14日 (土)

コンソールアプリの関連付けを変えてGUIから使い易くする。

VBSファイルの「コマンドプロンプトで開く」って使ってます?
コンソール入力には、使えても、コンソール出力には、使えないではありませんか。
ウィンドウが閉じてコンソール出力が見えない。 なので、ほとんど使わない。使えない。

他にも、バッチファイル、コンソールアプリなど、GUIからは、なんか使い難いと思いません?

そこで、batfile、cmdfile、exefile、vbsfileなどの関連付けを
以下のように追加または変更したほうが、使い易いし、使えると思います。

"パス\RunWithArgs.CMD" "%1" %*

※ バッチファイルは、PATHに置くか、フルパスを指定するか、いずれか。
※ バッチファイルにCMD/Cは不要。

@ECHO OFF
SETLOCAL
SET COMMAND=%*
SET /P ARGUMENTS="%COMMAND% ?"
CMD.EXE /C,%COMMAND% %ARGUMENTS%
ECHO リターンコード (ERRORLEVEL) : %ERRORLEVEL%
PAUSE

実行前に引数を追加できます。
リターンコード (ERRORLEVEL)を表示します。
コンソールウィンドウを閉じる前にPAUSEします。

CMD /C;←ここにお呪いを付けよう。

CMD.EXE /Cや/Kの直後には必ず、=;,のいずれかを付けよう。

CMD /C "ファイル" "引数"
のコマンドラインは、
ファイル" "引数
と解釈されるリスクがあります。
(詳細はCMD/?で、/Sの記事を参照してください。ただし難解です。)

CMD /C,"ファイル" "引数"
とすれば、確実です。

2006年10月10日 (火)

バッチファイルの二重起動を防止する。

追加書きで書き込まなければ、ファイルを変更しないことを利用します。

(
notepad.exe
) 0>>%0

標準入力なら書き込む心配がありません。

バッチファイルで処理を逐次化するロックメカニズム。

ファイルのoutputオープンが一人しかできないことを利用します。

(
notepad.exe
) 0>%TEMP%\lockword
DEL %TEMP%\lockword

シリアライズしたい処理(複数可)を括弧の中に書きます。サンプルではメモ帳。
lockwordは、逐次化する処理ごとに一意になるようにします。

ロック失敗側は、以下のエラーになります。
「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」

レジストリなどに実行中フラグを書き込んだり、
ファイルやフォルダの存否で制御するような例が散見されますが、
エラー発生時に自動ではリセットされず、手動で解除するまで起動不可になります。

ファイルのオープンはプロセス終了で資源回収(リソースパージ)されるので確実です。

2006年10月 7日 (土)

「名前を付けて保存」「ファイルを開く」でアプリが突然終了する障害の回避策

Windows Server 2003 または Windows XP SP2 + Adobe Reader 7 の環境では、
「名前を付けて保存」「ファイルを開く」ダイアログボックスで、マウスをファイルの上にかざすと、
アプリが突然終了します。

これは既知の障害です。

http://support.microsoft.com/kb/909486/

http://support.microsoft.com/kb/903154/

しかし、適切な回避策が明示されていないようです。

pdfshell.dllをリネームするという回避策もあるようですが、これは遣り過ぎです。
pdfファイルのプロパティページのタブまで表示されなくなります。

また、「フォルダオプション」-「表示」の
「フォルダとデスクトップの項目の説明をポップアップで表示する」のチェックを外す
という回避策もあるようですが、これも遣り過ぎです。
pdfファイル以外のファイルのポップアップまで表示されなくなります。

必要十分な回避策は、以下のレジストリキーを削除するか、無効にすることです。

HKEY_CLASSES_ROOT\Folder\shellex\ColumnHandlers\{F9DB5320-233E-11D1-9F84-707F02C10627}

例えば、キー名の先頭に;を加えたり、キー名の末尾に-disableを加えたりすれば、無効になります。

折角、PDFファイルのタイトルなどがスクリプトから簡単に取り出せるようになった、と思ったのに、残念なことです。
Windowsが修正されるまで、暫しお預けです。

と思ったら、Adobe Reader側が障害回避したようです。Adobe Reader 7.09では直っています。
或いは、Adobe Reader 8.0でもOKです。

2006年10月 5日 (木)

エクスプローラでフォルダを移動するときのトラブル予防のお呪いです。

同一ドライブ内でのフォルダ移動に、エクスプローラはあまり推奨できませんが、
それでも、エクスプローラでフォルダを移動する場合には、安全を期す為、
フォルダ名を変更してみるとよいでしょう。

変更できれば、使用中ではありません。変更できなければ、プロセスが使用中です。

移動後にフォルダ名を元に戻します。

エクスプローラでフォルダを移動するのは避けましょう。

フォルダ移動の途中で、ファイルやフォルダがプロセスで使用中とかでエラーになり、フォルダ移動が中途半端なまま中断して、二進も三進も行かなくなることがあります。

フォルダの移動は、同一ドライブ内では、 ディレクトリエントリをひとつ移すだけか、と思っていたら、そうではなく、 エクスプローラの場合、再帰的にファイル/サブフォルダを移動するみたいです。

1トランザクションで出来ることを、わざわざ複数トランザクションに分けてやるなんて、アトミシティが崩れて、中途半端な状態が生じるだけなのに、なんででしょうね。

一方、コマンドプロンプトのMOVEコマンドやFileSystemObjectのMoveFolderの場合は、ディレクトリエントリをひとつ移すだけのようで、1トランザクションです。

これがGUIでも、簡単に使えるとよいのですが。。。

そこで、以下を推奨します。

MoveHere.VBS フォルダの移動を1トランザクションで行うVBScript

MoveTo.VBS ファイル/フォルダをドロップすると特定フォルダに移動するVBScript

2006年10月 4日 (水)

ローカルのHTMLファイルを「Web アーカイブ、単一のファイル」で保存するときは、仮想ドライブで。

IEで、ローカルのHTMLファイルを「Web アーカイブ、単一のファイル」で保存すると、
MHTMLファイル内に構成ファイルのフルパス名が埋め込まれます。
もし、他人に渡すMHTMLファイルなどで、それを避けるには、

subst ドライブ文字: フォルダパス名

で作った仮想ドライブから開いて保存します。

「Web ページ、完全」保存の再保存で「Web ページの保存エラー」

インターネットからローカルに「Web ページ、完全」で保存したものを、
「Web ページ、完全」や「Web アーカイブ、単一のファイル」で、保存し直そうとすると、
「Web ページの保存エラー」「選択した場所に Web ページを保存できませんでした。」となることがあります。

その場合は、HTMLファイルから「Mark of the web」を削除するとよいようです。
<!-- saved from url=(####)http://~ -->
の行です。同じフォルダに別のファイル名で、保存します。

ただし、EUCをメモ帳で編集したりすると文字化けするので注意。

そんなときは、「Web ページ、HTML のみ」で、エンコードを変えて、同じフォルダに別のファイル名で、保存し直します。
すると、「Mark of the web」が無効になります。

「Web ページ、完全」や「Web アーカイブ、単一のファイル」で保存し直せます。

「Web ページ、完全」保存の.filesフォルダの「超」余計な機能は外しましょう。

IEで「Web ページ、完全」で保存すると、タイトル.htmファイルとタイトル.filesフォルダが出来ます。
これらのファイルとフォルダは、対で管理されていて、ファイル操作が自由にできません。
矢鱈と警告やエラーが出て、勝手に消えます!

この機能の詳細を調べようにも、キーワードが不明では、MSDNライブラリもインターネットも検索できません。

以下のキーワードで検索します。

"Connected Files"

NoFileFolderConnection

機械翻訳では「接続ファイル機能」となってますが、和訳は定まっていないようです。

詳細は、以下を参照のこと。

Managing the File System

HTML ファイルまたはフォルダに対するの操作は、同様名前のフォルダまたは HTML ファイルに適用されます。

【コラム】Windows XPスマートチューニング 第205回 HTMLファイルの保存時のコネクション機能を無効にする

これらの記事を参考に、この「超」余計な機能は外しておきましょう。
この機能を残しておいていいことは何一つありません!

「フォルダオプション」-「表示」
□ ファイル及びフォルダ
 □ Web ページとフォルダを対で管理します。
  ○ 対になった部分を 1 つのファイルとして表示し、管理も 1 つのファイルとして行います。
  ○ 対になった部分を両方とも表示し、管理は 1 つのファイルとして行います。
→ ◎ 対になった部分を両方とも表示しますが、管理は別々に行います。

MsgBoxやWScript.Echoでは、改行に、vbCrLfでなく、vbLfを使うべし。

MsgBoxやWScript.Echoで、改行に、vbCrLfを使うと、
メッセージボックス上では、CR+CR+LF になります。

見た目には分りませんが、Ctrl+C でコピーして、クリップボードから取り出してみると分ります。

特に、メモ帳に貼り付けて保存すると、
ちょっと前のメモ帳には、CR+CR+LF の改行が消えてなくなるという重大障害があって、大変でした。
最近のメモ帳は修正済みのようですが。。。

なので、MsgBoxやWScript.Echoでは、改行に、vbLfを使いましょう。

2006年10月 3日 (火)

FORコマンドの%変数は、数字にしましょう。

FOR %i IN ( ) DO

英字は、大文字と小文字が区別されて、間違い易いのと、
トークンの変数への自動割り当てが、i,j,k,...なので、
だったら、数字で、0,1,2,3,...のほうが自然だし、
自動割り当て可能な変数名も最大限多くなって、
いいんじゃないでしょうか?

FOR %0 IN ( ) DO

バッチファイル内では、引数(%0,%1,...)と、%%0,%%1,...で区別されます。

2006年10月 1日 (日)

ファイルの文字数をカウントするバッチファイル(wc-c.cmd)

VBScriptを使えば簡単ですが、バッチファイルだけでやるのはちょっと。。。

wc-c.cmd ファイル

SETLOCAL
SET FILE=%TEMP%\%RANDOM%
CMD /U /C TYPE %1 >%FILE%
FOR %%0 IN (%FILE%) DO SET /A SIZE=%%~z0/2
ECHO %SIZE%
DEL %FILE%

純正のchoice.exeとsleep.exeとrobocopy.exeの入手先

有償でよいならリソースキットですが、無償では、

choice.exeは、
Microsoft Product Support Reporting Tool for Microsoft Update ...
ユーティリティを報告している Microsoft プラットフォーム サポートの説明
Download the MPSRPT_Network.exe package now.
などに。

sleep.exeとrobocopy.exeは、
Windows Server 2003 Resource Kit Tools

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