9

二重引用符がネストされたバッチ関数に引数を渡す際に問題があります。

バッチ ファイルの例を次に示します。

@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
arg 3: space.txt""

作るにはどうすればいいarg 2: blaat2 "c:\test\filenamewith space.txt"ですか?機能の調整や変更はできませんのでご了承ください%path_with_space%。関数に渡されるものだけを制御できます。

4

5 に答える 5

11

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
于 2012-09-23T15:23:45.663 に答える
2

これを見つけましたが、私にできることは、問題を別の領域に移動することだけでした。

引用符の操作

@SET 

path_with_space="c:\test\filenamewith space.txt"

:: Remove quotes
@SET _string=###%path_with_space%###
@SET _string=%_string:"###=%
@SET _string=%_string:###"=%
@SET _string=%_string:###=%

@echo %_string%

@CALL :FUNCTION blaat1, "blaat2 %_string%"
@GOTO :EOF

:FUNCTION
@echo off
@echo arg 1: %~1
@echo arg 2: %~2
@echo arg 3: %~3

:EOF


pause
于 2012-09-23T13:20:48.980 に答える
2

私はそれが可能だとは思わない。

パラメータ区切り文字として解釈されないようにスペースをエスケープすることはできません。パラメータにスペースを含める唯一の方法は、スペースを引用符で囲むことです。引用するスペースとそうでないスペースが必要なので、それは不可能です。

于 2012-09-23T13:49:20.990 に答える
1

@ジェブ +1

@davor

単純に二重引用符を使用しないのはなぜですか

@SET path_with_space=""c:\test\filenamewith space.txt""
@CALL :FUNCTION blaat1, "blaat2 %path_with_space%", blaat3
@GOTO :EOF

:FUNCTION
@echo off
echo arg 1: %~1
::--------------------
set arg2=%~2
set arg2=%arg2:""="%
::-------------------
echo arg 2: %arg2%
echo arg 3: %~3
GOTO :EOF 

出力は次のとおりです。

arg 1: blaat1
arg 2: blaat2 "c:\test\filenamewith space.txt"
arg 3: blaat3
于 2012-09-24T09:49:05.857 に答える