dbenham が言ったように、引用符なしでパラメーター内のスペースをエスケープすることは不可能のようです。ただし、レシーバー関数がパラメーターを取得する
方法を知っていれば可能です。
次に、エスケープされた遅延変数を介してパラメーターを転送できます。変数は呼び出しではなく展開され、関数内でのみ展開されます。
また、パラメーターは関数内で変数に割り当てられる必要がありますが、これは適切で読みやすいコードの場合に当てはまります。
setlocal EnableDelayedExpansion
set path_with_space="c:\test\filenamewith space.txt"
@CALL :FUNCTION blaat1, "blaat2 ^!path_with_space^!"
GOTO :EOF
:FUNCTION
@echo off
echo arg 1: %~1
echo arg 2: %~2
echo arg 3: %~3
GOTO :EOF
出力は次のとおりです。
arg 1: blaat1
arg 2: blaat2 "c:\test\filenamewith space.txt"
arg 3:
編集:バッチインジェクションによるソリューション
これは、遅延拡張を常に無効にする必要がある場合でも機能します。
しかし、次に、関数内でパラメーターがどのように展開されるかを知る必要があります。
@echo off
set path_with_space="c:\test\filenamewith space.txt"
CALL :FUNCTION 1 2 ""^^"&call:inject:""
exit/b
:inject
set arg1=blaat1
set arg2=blaat2 %path_with_space%
set arg3=none
exit /b
:FUNCTION
@echo off
set "arg1=%~1"
set "arg2=%~2"
set "arg3=%~3"
echo arg 1: %arg1%
echo arg 2: %arg2%
echo arg 3: %arg3%
GOTO :EOF