4

私は、渡されるすべてのファイル名が有効な URL であることを必要とするプログラムで作業するという不運に見舞われました。(いいえ、理由はわかりません。)コマンド ラインにドロップしてfile:毎回 URL を手動で作成する必要はなく、Windows GUI からドラッグしたファイルを単純にドロップできるバッチ ファイルをまとめています。

完全で適切な URL エンコーダーは、私のニーズや関心を超えています (とにかく、アプリがチョークする文字のほとんどは、Windows ファイル名では有効ではありません) が、解決する必要がある 2 つのケースは、バックスラッシュとスペースです。バックスラッシュは変数置換構文 ( SET URL=%URL:\=/%) で簡単に処理できますが、スペースは注意が必要です。これ%は、URL とバッチ ファイルの両方にとって特別です。

私がよく知っている ( ^%, %%) どちらのタイプのバッチ エスケープでも、変数の置換を希望どおりに動作させることができず、解決策をグーグルで検索することに成功していません。バッチの達人は私を助けてくれますか?

これが私がこれまでに持っているものです:

@ECHO OFF

SETLOCAL

SET URLPATH=file:/%~dp1
SET URLPATH=%URLPATH:\=/%

REM none of these work
REM SET URLPATH=%URLPATH: =%20%
REM SET URLPATH=%URLPATH: =%%20%
REM SET URLPATH=%URLPATH: =^%20%

REM works; I just need to figure out how to generate it
SET URLPATH=file:/C:/Documents%%20and%%20Settings/bblank/example.dat

stupidapp.exe %URLPATH%

ENDLOCAL
4

2 に答える 2

3

補足-%~f1代わりにあなたが望むと思います%~dp1

遅延拡張に切り替える必要があります。

@echo off
setlocal enableDelayedExpansion

set "URLPATH=file:/%~f1"
set "URLPATH=!URLPATH:\=/!"
set "URLPATH=!URLPATH: =%%20!"
stupidapp.exe !URLPATH!

endlocal

!遅延展開が有効になっている場合に %1 を展開すると破損するため、ファイル名に文字が含まれている場合は、もう少し作業が必要です。

@echo off
setlocal disableDelayedExpansion
set "URLPATH=file:/%~f1"
setlocal enableDelayedExpansion
set "URLPATH=!URLPATH:\=/!"
set "URLPATH=!URLPATH: =%%20!"
stupidapp.exe !URLPATH!

endlocal
endlocal
于 2012-04-18T22:42:27.883 に答える
2

dbenham の解決策はほぼ確実に好ましい (かなり読みやすい) ですが、完全を期すために、別の解決策を次に示します。

SET URLPATH=file:/%~dp1
SET URLPATH=%URLPATH:\=/%

REM for each space in the path, split the path into the portions before and after
REM that space, then join them with an escaped space
:ESCAPE_SPACE
SET TRAILING=%URLPATH:* =%
CALL SET URLPATH=%%URLPATH: %TRAILING%=%%
SET URLPATH=%URLPATH%%%20%TRAILING%
IF NOT "%URLPATH%"=="%URLPATH: =%" GOTO ESCAPE_SPACE

stupidapp.exe %URLPATH%
于 2012-04-19T00:01:44.673 に答える