[前の記事]« ウィンドウの表示位置を固定したい
[次の記事]FDへ不特定数のファイルを移動したい »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「CALL,GOTO」索引へ

名前に「%」を含むファイルをCALLのパラメータに渡すと「%」が消えてしまう

190.
%を含むファイル名の処理法方(CALL)
2004年12月30日(木) 13時39分
こぶん
●DOS/Windowsのバージョン↓
Microsoft Windows XP [Version 5.1.2600]

あるフォルダ中に"abc%def"という名前のファイルがあったとします。
そこで、次のバッチファイルを実行しますと
for %%F in (".\*.*") do call :callchk "%%~F"
goto :EOF

:callchk
echo "%~0" "%~1"
:EOF

以下のように実行され、%が消えてしまいます。
>for %F in (".\*.*") do call :callchk "%~F" 
>call :callchk ".\abc%def" 
>echo ":callchk" ".\abcdef" 
":callchk" ".\abcdef"

また、"a%windir%b"のように環境変数名が含まれているファイルがあった場合には
>for %F in (".\*.*") do call :callchk "%~F" 
>call :callchk ".\a%windir%b" 
>echo ":callchk" ".\aC:\WINDOWSb" 
":callchk" ".\aC:\WINDOWSb"
このように環境変数が展開されてしまいます。

こういった、バッチファイルにおける特殊文字を含む文字列を展開させずに処理するためにはどのようにしたら良いのかお知恵をお貸しください。
191.
Re:%を含むファイル名の処理法方(CALL)
2004年12月30日(木) 15時51分
otn
>●DOS/Windowsのバージョン↓
>Microsoft Windows XP [Version 5.1.2600]

>あるフォルダ中に"abc%def"という名前のファイルがあったとします。
>そこで、次のバッチファイルを実行しますと
>for %%F in (".\*.*") do call :callchk "%%~F"
>goto :EOF

>:callchk
>echo "%~0" "%~1"
>:EOF

>以下のように実行され、%が消えてしまいます。
>>for %F in (".\*.*") do call :callchk "%~F" 
>>call :callchk ".\abc%def" 
>>echo ":callchk" ".\abcdef" 
>":callchk" ".\abcdef"

>また、"a%windir%b"のように環境変数名が含まれているファイルがあった場合には
>>for %F in (".\*.*") do call :callchk "%~F" 
>>call :callchk ".\a%windir%b" 
>>echo ":callchk" ".\aC:\WINDOWSb" 
>":callchk" ".\aC:\WINDOWSb"
>このように環境変数が展開されてしまいます。

>こういった、バッチファイルにおける特殊文字を含む文字列を展開させずに処理するためにはどのようにしたら良いのかお知恵をお貸しください。

このあたり、難しいところですね。どれも一長一短。

(案1) 特殊文字を含むファイル名を禁止する

(案2) callを使わない
for %%F in (".\*.*") do (
 echo  "%%~F"
)
 ただし、( ) で囲った中では%処理が先にされるので色々制約あり

(案3) 遅延展開を使い事前に加工
setlocal enabledelayedexpansion
for %%F in (".\a*.*") do (
 set F="%%~F"
 set F=!F:%%=%%%%!
  rem 他の特殊文字もあればそれらも同様の対処
 call :callchk !F!
)
goto :eof

:callchk
echo "%~0" "%~1"

(案4) ファイル経由で受け渡し
for %%F in (".\a*.*") do (
 echo %%~F>tmpfile
 call :callchk
)
goto :eof

:callchk
set /p F=<tmpfile
echo "%~0" "%F%"
192.
Re2:%を含むファイル名の処理法方(CALL)
2004年12月30日(木) 16時40分
こぶん
素早いご返答ありがとうございます。

>>こういった、バッチファイルにおける特殊文字を含む文字列を展開させずに処理するためにはどのようにしたら良いのかお知恵をお貸しください。

>このあたり、難しいところですね。どれも一長一短。

>(案1) 特殊文字を含むファイル名を禁止する
URIをMIMEエンコードしたファイル名が既に大量にある状態ですので今回は適用が難しいです。(:<>{}*/などがもろに元ファイル名に存在するので容易に元の名前に戻せるようにMIMEエンコードしたのが祟りました)

>(案2) callを使わない
> ただし、( ) で囲った中では%処理が先にされるので色々制約あり
元のバッチスクリプトに適用してみようとしましたが、あちこちで呼んでいる関数的に使われている部分でしたので、後のメンテナンスを考えると採用するのは難しそうです。

>(案3) 遅延展開を使い事前に加工
ファイル・フォルダ名を取り出すために使っている全てのFOR文にDOSのメタキャラクタをエスケープする処理をこの遅延環境変数の展開と置き換えを参考に組み込んでみました。
今のところファイルのオープンに失敗することなく順調に動いているようです。

>(案4) ファイル経由で受け渡し
処理的には分かりやすいのですが、標準コマンドの機能内で確実に一意なファイル名を作成する方法が思いつかなかったのでした。

多様な方法をお教えいただけ、たいへん参考になり感謝しております。
 
 


カテゴリー「CALL,GOTO」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2004年12月30日 09:38に投稿されたエントリーのページです。

ひとつ前の投稿は「ウィンドウの表示位置を固定したい」です。

次の投稿は「FDへ不特定数のファイルを移動したい」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート