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年10月 | トップページ | 2006年12月 »

2006年11月28日 (火)

正規表現でリネームする。

例えば、リネーム *.* /Path/i File

リネーム.CMD ファイルセット パターン 置換文字列 [/Y}

@if(0)==(0) ECHO OFF
FOR %%0 IN (%1) DO (
FOR /F "delims=" %%1 IN ('CScript.exe //NoLogo //E:JScript "%~f0" "%%0" "%~2" "%~3"') DO (
ECHO RENAME "%%0" "%%1"
IF /I "%4"=="/Y" RENAME "%%0" "%%1"
)
)
GOTO :EOF
@end
WScript.Echo(WScript.Arguments.Item(0).replace(eval(WScript.Arguments.Item(1)),WScript.Arguments.Item(2)));

/Yを指定しないと、リネームコマンドを表示するだけで実行しません。
/Yを指定すると、リネームを実行します。

2006年11月27日 (月)

コマンドラインやスクリプトから、ファイルやフォルダに「貼り付け」る。

エクスプローラGUIの右クリック「貼り付け」がコマンドラインやスクリプトから出来ます。

貼り付け.CMD ファイル

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" "%~dp1" "%~nx1"
GOTO :EOF
@end
var Shell=new ActiveXObject('Shell.Application');
var Folder=Shell.NameSpace(WScript.Arguments.Item(0));
var FolderItem=Folder.ParseName(WScript.Arguments.Item(1));
if(FolderItem){
  var Verbs=FolderItem.Verbs()
  for(var k=0;k<Verbs.Count;k++){
    if(Verbs.Item(k).Name=="貼り付け(&P)"){
      Verbs.Item(k).DoIt();
      WScript.Quit();
    }
  }
  WScript.Echo('貼り付けるデータがありません');
}
else WScript.Echo('ファイルがありません');

コマンドラインやスクリプトから、ファイルやフォルダを「コピー」状態にする。

エクスプローラGUIの右クリック「コピー」「切り取り」がコマンドラインやスクリプトから出来ます。

コピー.CMD ファイル

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" "%~dp1" "%~nx1"
GOTO :EOF
@end
//var ie=new ActiveXObject('InternetExplorer.Application');//IE6
var ie=GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}");//IE7
ie.Navigate(WScript.Arguments.Item(0));
while(ie.Busy||ie.ReadyState!=4) WScript.Sleep(100);
var FolderItem=ie.Document.Folder.ParseName(WScript.Arguments.Item(1));
if(FolderItem) FolderItem.InvokeVerb('copy');
else WScript.Echo('ファイルがありません');

2006年11月26日 (日)

コマンドラインでファイルやフォルダを名前に「コピー (n) ~ 」を付けて複製する。

エクスプローラでは、CTRLキーを押しながらドラッグして、ファイルを複製できます。
それをコマンドラインで行います。

複製.CMD ファイル...

@if(0)==(0) ECHO OFF
FOR %%0 IN (%*) DO CScript.exe //NoLogo //E:JScript "%~f0" "%%~dp0" "%%~nx0"
GOTO :EOF
@end
var Folder=new ActiveXObject('Shell.Application').NameSpace(WScript.Arguments.Item(0));
var FolderItem=Folder.ParseName(WScript.Arguments.Item(1));
Folder.CopyHere(FolderItem,8);

2006年11月25日 (土)

ファイルをパイプ(FIFOファイル)代わりに使う。

Windows2000/XPでは、ファイルを1 writer and n readerで同時にオープンできます。

これを利用すれば、ファイルをパイプ代わりに出来ます。

以下はUnixのtailコマンドの-fオプション擬似です。

TAIL-F.CMD ファイル

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %1
GOTO :EOF
@end
var StdIn=new ActiveXObject('Scripting.FileSystemObject').OpenTextFile(WScript.Arguments.Item(0));
while(true) if(StdIn.AtEndOfStream) WScript.Sleep(1000);else WScript.StdOut.Write(StdIn.Read(4096));

コマンドプロンプトを2つ開き、一方で、

ECHO AAA>LOG
TAIL-F.CMD LOG

として、他方で、

ECHO BBB>>LOG
ECHO CCC>>LOG

としてみてください。

最後はCTRL-Cで打ち切ってください。

2006年11月23日 (木)

複数ファイルをドロップしたときの引数の順序は?

複数ファイルをドロップしたり、「貼り付け」たり、「SendTo」メニューに送ったとき、
アプリの引数に現れる順序は、ドラッグしたり、右クリックしたときに、
マウスでポイントしていたファイルが先頭です。残りは選択項目の並びで続きの順序です。
選択項目の途中をポイントしていたときは、末尾で先頭にラップラウンドします。

例えば、
■ファイル1
□ファイル2
■ファイル3
□ファイル4
■ファイル5
で、ファイル1、3,5を選択して、ファイル3にマウスを置いてドラッグまたは
右クリックで「コピー」や「送る」を選択した場合、
アプリには、ファイル3,5、1の順に引数が渡ります。

ドロップ時のカレントディレクトリは?

ダブルクリックや右クリックメニューから起動したときのカレントディレクトリは、そのフォルダです。

「ファイル名を指定して実行」からアプリを起動したときのカレントディレクトリは、
C:\Documents and Settings\ユーザ名
固定のようです。

ファイルをアプリファイルにドロップしたり、「貼り付け」たり、「SendTo」メニューに送ったとき、「スタート」やツールバー、「お気に入り」や「リンク」メニューなどからアプリを起動したときのカレントディレクトリは、エクスプローラプロセスのカレントディレクトリです。

一般には、
C:\Documents and Settings\ユーザ名
または、
C:\Program Files\Common Files\System\MAPI\1041
のことが多いようです。

もし、このいずれかであれば、カレントディレクトリを使わないほうがよいでしょう。
或いは、ショートカットを使うようにして、作業フォルダを指定しておくとよいでしょう。

異なるフォルダの複数のファイルをドラッグする。

同じフォルダの複数のファイルをドラッグするのは簡単ですが、
異なるフォルダの複数のファイルをドラッグするのは、どうするか。

例えば、c:\フォルダ1のファイル1とc:\フォルダ2のファイル2をドラッグするには、
「ファイルやフォルダの検索」で、

ファイル名のすべてまたは一部(O): "ファイル1";"ファイル2"

探す場所(L): c:\フォルダ1;c:\フォルダ2

で「検索」し、「検索結果」から選択してドラッグします。

2006年11月21日 (火)

「デスクトップ」の増殖を阻止せよ。

エクスプローラのフォルダバーで「デスクトップ」が増殖します。

「デスクトップ」をツールバーにしていると発生するようです。

なので、「デスクトップ」ツールバーは閉じてしまいましょう。

しかし、それでは不便なので、代わりに、
デスクトップディレクトリをスタートボタンにドロップして、
スタートメニューに「デスクトップ」を登録します。

或いは、「デスクトップ」を他のツールバーの中に入れて使います。

2006年11月18日 (土)

同じ木構造で比較先ディレクトリに同名ファイルがないものを比較元ディレクトリから削除する。

昔はツールを使って「find dir1 -t -^exists dir2 -rm」で簡単に出来たのですが、
ツールがLFNに対応してないため、これに代わるバッチファイルを作ってみました。

使用法: FindNotExistsRm.CMD 比較元ディレクトリ 比較先ディレクトリ

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%0 IN (%1) DO (
FOR /R %1 %%1 IN (*) DO (
SET x=%%~f1
SET x=!x:%%~f0=%2!
If NOT EXIST "!x!" (
echo DEL "%%~f1"
)
)
)

念のため、DELコマンドはechoでコメントにしてあります。
各自のシステム環境で十分テストした上でコメントを外してください。

2006年11月15日 (水)

同じ木構造でコピー先ディレクトリに同名ファイルがないものだけをコピーする。

昔はツールを使って「find dir1 -t -^exists dir2 -cp dir2」で簡単に出来たのですが、
ツールがLFNに対応してないため、これに代わるバッチファイルを作ってみました。

使用法: FindNotExistsCp.CMD コピー元ディレクトリ コピー先ディレクトリ

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%0 IN (%1) DO (
FOR /R %1 %%1 IN (*) DO (
SET x=%%~f1
SET x=!x:%%~f0=%2!
IF NOT EXIST "!x!" (
IF NOT EXIST "!x!\..\*" (
echo MD "!x!\.."
)
echo COPY "%%~f1" "!x!"
)
)
)

念のため、MD/COPYコマンドはechoでコメントにしてあります。
各自のシステム環境で十分テストした上でコメントを外してください。

2006年11月 7日 (火)

同じ木構造で比較先ディレクトリに同一ファイルがあるものを比較元ディレクトリから削除する。

昔はツールを使って「find dir1 -t -comp dir2 -rm」で簡単に出来たのですが、
ツールがLFNに対応してないため、これに代わるバッチファイルを作ってみました。

Windows XPに付いているSupport Toolsのbindiff.exeを使用しています。
普通は、C:\Program Files\Support Tools\bindiff.exe にあります。
もし、なければ、"bindiff.exe"で検索して、MSのサイトからダウンロードしてください。

使用法: FindCompRm.CMD 比較元ディレクトリ 比較先ディレクトリ

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%0 IN (%1) DO (
FOR /R %1 %%1 IN (*) DO (
SET x=%%~f1
SET x=!x:%%~f0=%2!
FOR %%2 IN ("!x!") DO IF "%%~t1"=="%%~t2" IF "%%~z1"=="%%~z2" (
BINDIFF  "%%~f1" "%%~f2"
IF !ERRORLEVEL!==1 (
echo DEL "%%~f1"
)
)
)
)

念のため、DELコマンドはechoでコメントにしてあります。
各自のシステム環境で十分テストした上でコメントを外してください。

bindiff.exeがないときは、fc.exeで代替します。

FC /B "%%~f1" "%%~f2" >NUL
IF !ERRORLEVEL!==0 (

同じ木構造で比較先ディレクトリに同名ファイルがあるものを比較元ディレクトリから削除する。

昔はツールを使って「find dir1 -t -exists dir2 -rm」で簡単に出来たのですが、
ツールがLFNに対応してないため、これに代わるバッチファイルを作ってみました。

使用法: FindExistsRm.CMD 比較元ディレクトリ 比較先ディレクトリ

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%0 IN (%1) DO (
FOR /R %1 %%1 IN (*) DO (
SET x=%%~f1
SET x=!x:%%~f0=%2!
FOR %%2 IN ("!x!") DO (
echo DEL "%%~f1"
)
)
)

念のため、DELコマンドはechoでコメントにしてあります。
各自のシステム環境で十分テストした上でコメントを外してください。

2006年11月 6日 (月)

CALLコマンドと%%で遅延展開を代替する。

IF文やFOR文などの制御文?には使えませんが、ECHO、SET、GOTOなどの実行文?では、
CALLコマンドで、%%変数名%%を使うと、遅延展開?されます。

for %%0 in (a b c) do (
set z=%%0
echo %z%
set y=%z%
echo %y%
)
for %%0 in (a b c) do (
set z=%%0
call echo %%z%%
call set y=%%z%%
call echo %%y%%
)

FOR /F %%0 IN ('%%遅延%%')の'コマンド'内も遅延展開?されます。

コマンドラインで、%のエスケープ方法

バッチファイルでは、%は、%%でエスケープされる。
%~%は、環境変数がなくても置換される。
もし、環境変数がなければ、空と置換されて、%~%が消える。

コマンドプロンプトでは、簡単なエスケープ方法はない。
環境変数がなければ置換されずに、そのまま残る。
これを利用してエスケープする。

コマンドプロンプトで、%をエスケープするには、%の直後に^や継続行を入れる。

ECHO %^CD%

ECHO %^(改行)
More ? CD%

は、

%CD%

と出る。

前者は^CDという環境変数がないことを利用している。当然、

SET "^CD=bbb"

のようにして、^CDという環境変数があると置換される。

引用符("~")内では、%はエスケープされないが、^はエスケープされることに注意。

ECHO "%^CD%"

は、

"%^CD%"

と出る。

ただし、引用符の前に^を付けると、^"~^"内の^はエスケープされません。
^だけでなく、&|)などもエスケープされません。

ECHO ^"%^CD%"

は、

"%CD%"

と出ます。

コマンドプロンプトで、URLの%などエスケープするには、%の直後にタブや^を入れる。

Start IExplore.exe http://....%(タブ)8c%(タブ)9f...
Start IExplore.exe http://....%^8c%^9f...

URLやHTMLでは、タブが無視されること利用する。

引用符("~")内では、^はエスケープされることに注意。

(○)Start IExplore.exe "http://....%(タブ)8c%(タブ)9f..."
(×)Start IExplore.exe "http://....%^8c%^9f..."

前者は通るが、後者は^はそのまま渡るので駄目。

(○)Start IExplore.exe ^"http://....%^8c%^9f...^"

とすればOK。

2006年11月 3日 (金)

FORコマンドで、エクスプローラで選択したファイル群を処理する。

大量のファイルをアプリファイルにドロップすると、引数の長さ制限でエラーになります。
そういう場合は、FORコマンドで、エクスプローラで選択したファイル群を処理するとよいでしょう。

ForSelectedItems.CMD

@if(0)==(0) ECHO OFF
FOR /F "delims=" %%0 IN ('CScript.exe //NoLogo //E:JScript "%~f0"') DO ECHO "%%0"
GOTO :EOF
@end
var ie=new ActiveXObject('Shell.Application').Windows().Item();
if(ie){
  var FolderItems=ie.Document.SelectedItems();
  if(FolderItems){
    for(var k=0;k<FolderItems.Count;k++) WScript.Echo(FolderItems.Item(k).Path);
  }
}

コマンドプロンプトからエクスプローラで(複数)選択したファイルのパス名を取り出す。

選択したファイルのパス名を標準出力に出力します。

SelectedItems.CMD

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0"
GOTO :EOF
@end
var ie=new ActiveXObject('Shell.Application').Windows().Item();
if(ie){
  var FolderItems=ie.Document.SelectedItems();
  if(FolderItems){
    for(var k=0;k<FolderItems.Count;k++) WScript.Echo(FolderItems.Item(k).Path);
  }
}

FORコマンドでクリップボードを処理する。

大量のファイルをアプリファイルにドロップすると、引数の長さ制限でエラーになります。
そういう場合は、Send To Clipboard As Name などで、一旦クリップボードにパス名を入れて、
FORコマンドでクリップボードからパス名を取り出して処理するとよいでしょう。

@ECHO OFF
FOR /F "delims=" %%0 IN ('MSHTA.EXE "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();"') DO ECHO %%0

コマンドラインから仮想フォルダの「Start Menu Folder」を開く。

START shell:::{48e7caab-b918-4e58-a94d-505519c795dc}

shell:Start Menu は実フォルダ。

コマンドラインから「プログラムの追加と削除」を開く。

START shell:::{2559a1f7-21d7-11d4-bdaf-00c04f60b9f0}

コマンドラインから「受信トレイ - Microsoft Outlook」を開く。

START shell:::{2559a1f5-21d7-11d4-bdaf-00c04f60b9f0}

コマンドラインから「ホーム - Microsoft Internet Explorer」を開く。

START shell:::{2559a1f4-21d7-11d4-bdaf-00c04f60b9f0}

コマンドラインから「ヘルプとサポート センター」を開く。

START shell:::{2559a1f1-21d7-11d4-bdaf-00c04f60b9f0}

2006年11月 2日 (木)

バッチファイル実行後にコンソールを使う。

バッチファイルをダブルクリックやドロップで起動すると、
バッチファイル実行後にコンソールが閉じます。

閉じないようにするには、バッチファイルの最後にPAUSEコマンドを入れたりします。

しかし、いずれにせよ、続けてコンソールを使うことが出来ません。

続けてコンソールを使うには、バッチファイルの最後に
CMD /K
を入れておくとよいでしょう。

しかし、今度は逆に、コンソールでそのバッチを使ったときに、
サブコンソールが出来て、鬱陶しくなります。

そのバッチファイルの終了と共にコンソールが閉じる場合に限って、
コンソールを開き続けるようにするには、
バッチファイルの最後に以下を入れておくとよいでしょう。

SETLOCAL
SET _=%0
ECHO %CMDCMDLINE% | FINDSTR /IR "CMD.*/C.*%_:\=\\%" >NUL
ENDLOCAL
IF NOT ERRORLEVEL 1 CMD /K

そのバッチファイルの終了と共にコンソールが閉じる場合に限って、
コンソールが自動的に閉じないようにするには、
バッチファイルの最後に以下を入れておくとよいでしょう。

SETLOCAL
SET _=%0
ECHO %CMDCMDLINE% | FINDSTR /IR "CMD.*/C.*%_:\=\\%" >NUL
ENDLOCAL
IF NOT ERRORLEVEL 1 PAUSE

コマンドプロンプトで、タブを補完キーにしていると、タブが入力できない。

コマンドプロンプトでFOR /F "delims=にタブを入れたいが、
タブが補完キーに解釈されて、入力できない場合は、

サブシェルを開いて一時的に、補完を無効にする。
CMD /F:OFF
FOR /F "delims=タブ
EXIT

環境変数にタブ文字を設定しておいて置換する。

FOR /F "delims=" %0 IN ('TYPE CON') DO SET tab=%0
(タブ)(改行)
^Z

FOR /F "delims=%tab%

コマンドラインから「検索(C)」→「ファイルやフォルダ(F)...」を開く。

START shell:::{2559a1f0-21d7-11d4-bdaf-00c04f60b9f0}

コマンドラインから「ファイル名を指定して実行(R)...」を開く。

START shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}

コマンドラインから「タスク バーと [スタート] メニューのプロパティ」を開く。

START shell:::{0DF44EAA-FF21-4412-828E-260A8728E7F1}

コマンドラインから「フォルダ オプション」を開く。

START shell:::{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}

« 2006年10月 | トップページ | 2006年12月 »