1

バッチスクリプトで、%~dp0. 問題は、スクリプトの一部で、%~dp0返されるはずのもの、つまり、実行中のスクリプトを含むフォルダーのドライブを含むフルパスを返すことです (ここでは 'C:\Data\name\App\App\' )。コードの他の部分では%~dp0、スクリプトを含むドライブのみを返します (ここでは 'C:\')。

これが私のスクリプトです(これまでで最初のバッチスクリプトです:D):

@ECHO OFF

ECHO.
:: run the script with the command new-built.bat /all -arch x86 -config release


SETLOCAL EnableDelayedExpansion
SET options=arch version config
SET what_to_build=all lib
:: the three following lines returns what is expected
echo %%~dp0 is returning : %~dp0
echo %%~p0 is returning : %~p0
echo %%~d0 is returning : %~d0
echo The absolute path to this script is : %~dp0%0

:: read what to build, ie all or lib only
FOR %%i in (%what_to_build%) do if %1==/%%i (
SHIFT
GOTO %%i
)


::the following sections (:readoptions and :optlp) work together to collect the options entered in the command, used to launch this script. It saves the values the two arrays "options" and "what_to_build" array

:readoptions
echo Entered the read options label
rem -- initialises variables arch, version and config with empty string
FOR %%i IN (%options% badoptions) DO (SET %%i=)
:optlp
echo Entered the read options loop
SET _parm1=%1
IF NOT DEFINED _parm1 GOTO :END
IF DEFINED _parm1 FOR %%i IN (%options%) DO IF .%_parm1%==.-%%i SET %%i=%2
IF DEFINED %%i shift&shift&(SET _parm1=)
IF DEFINED _parm1 SET badoptions=%badoptions% %1&SHIFT
GOTO :optlp

:all
echo Entered the all label ...
CALL :readoptions %*
echo About to build complete app for x86 in release config
set CYGWIN_DIR="%~dp0" 
:: I want this line to return "C:\Data\name\App\App\" without quotes, but it's returning "C:\"
echo Cygwin dir (not returning what I want): %CYGWIN_DIR%
rem build lib
call %~dp0\build_scripts\build_lib_x86.bat
rem build the Visual Studio Solution
start "Build App x86 - release config" /W "%~dp0%build_scripts\build_app_x86_release.bat"


goto :end

:END
echo Program is done
endlocal

ここに私が得るトレースがあります:

%~dp0 is returning : C:\Data\name\App\App\
%~p0 is returning : \Data\name\App\App\
%~d0 is returning : C:
The absolute path to this script is : C:\Data\name\App\App\new-build.bat
Entered the all label ...
Entered the read options label
Entered the read options loop
Entered the read options loop
Entered the read options loop
Entered the read options loop
Entered the read options loop
Entered the read options loop
Program is done
About to build complete app for x86 in release config
Cygwin dir (not returning what I want) : "C:\"
The system cannot find the path specified.
Program is done

私が見逃している何かが起こっているに違いありません。どんな助けでも大歓迎です。

一番

4

1 に答える 1

1

Ooooh-大きなトラブル!

@ECHO OFF

ECHO.
:: run the script with the command new-built.bat /all -arch x86 -config release


SETLOCAL EnableDelayedExpansion
SET options=arch version config
SET what_to_build=all lib
:: the three following lines returns what is expected
echo %%~dp0 is returning : %~dp0
echo %%~p0 is returning : %~p0
echo %%~d0 is returning : %~d0
echo The absolute path to this script is : %~dp0%0

new-built.bat / all -arch x86 -configリリースが与えられる%1と、/all

:: read what to build, ie all or lib only
FOR %%i in (%what_to_build%) do if %1==/%%i (
SHIFT
GOTO %%i
)

だから、だから、これ%1/allで到着します:all%1=-arch %2=x86 %3=-config %4=release%*=/all -arch x86 -config release

その後、同上%1でし/libたが、到着します:lib

ただし、%1の他の値の場合、処理はここから次のステートメントまで直接課金されます。


:all...だから私たちはと一緒 に到着し%1=-arch %2=x86 %3=-config %4=releaseます%*=/all -arch x86 -config release

:all
echo Entered the all label ...
CALL :readoptions %*

:readoptionsは%*ORIGINALパラメータでCALLされるため、:readoptionsに渡されますが、goto :EOFこれを'goto END and hence the messageProgram is done is displayed - and processing returns to the statement following theCALL`に変更する代わりに、

echo About to build complete app for x86 in release config
set CYGWIN_DIR="%~dp0" 
:: I want this line to return "C:\Data\name\App\App\" without quotes, but it's returning "C:\"
echo Cygwin dir (not returning what I want): %CYGWIN_DIR%
rem build lib
call %~dp0\build_scripts\build_lib_x86.bat
rem build the Visual Studio Solution
start "Build App x86 - release config" /W "%~dp0%build_scripts\build_app_x86_release.bat"


新たに始めましょう...

実際には、CYGWIN_DIRにCYGWINディレクトリの名前の値を割り当てたいと思います。これを解決できる可能性がありますが、環境に永続的に設定されている場合ははるかに優れています。これを行う簡単な方法は次のとおりです。

SETX CYGWIN_DIR "wherever your cygwin dir is"
SETX CYGWIN_DIR "wherever your cygwin dir is" /M

(最初は現在のLOGONセッションのNEW CMDインスタンスに値を割り当て、2番目は将来のログオンセッションに割り当てます。IOW、2番目を実行して再起動します...必要に応じてSETX CYGWIN_DIR ""を使用してエントリを削除できます)

@ECHO OFF
ECHO.
:: run the script with the command new-built.bat /all -arch x86 -config release

SETLOCAL EnableDelayedExpansion
SET options=arch version config
SET SLASHOPTS=ALL LIB
(SET SWITCHES=)
:: %CD% is the magic pseudovariable for the current directory.
:: quote it if you wish
SET CYGWIN_DIR=%CD%
:: The above line of course only if you want CYGWIN_DIR to be set to the current directory
CALL :READOPTIONS %*
:: NOTE THAT %badoptions% now contains a list of the items NOT
:: involved in the OPTIONS, SWITCHES or SLASHOPTIONS
:: read what to build, ie all or lib only
:: ONE WAY...
IF DEFINED ALL goto ALL
IF DEFINED LIB goto LIB
:: ANOTHER WAY to do the same thing
for %%i in (%SLASHOPTS%) DO if defined %%i goto %%i
:: EEK! Neither ALL not LIB was specified - what to do?
echo EEK! Neither ALL not LIB was specified - exiting!
goto :EOF


:all
echo Entered the all label ...
echo About to build complete app for x86 in release config
echo Cygwin dir (not returning what I want): %CYGWIN_DIR%
rem build lib
:: I'll assume %CYGWIN_DIR%\build_scripts is where you're keeping this batch
call %CYGWIN_DIR%\build_scripts\build_lib_x86.bat
rem build the Visual Studio Solution
start "Build App x86 - release config" /W "%CYGWIN_DIR%\build_scripts\build_app_x86_release.bat"


goto end

:LIB
echo LIB processing not yet defined
goto end

:END
echo Program is done
endlocal

:readoptions
echo Entered the read options label
rem -- initialises variables arch, version and config with empty string
:readoptions
FOR %%i IN (%options% %slashopts% %switches% badoptions) DO (SET %%i=)
:optlp
SET _parm1=%1
IF NOT DEFINED _parm1 GOTO :EOF
FOR %%i IN (%switches%) DO IF /i %_parm1%==-%%i SET %%i=Y&(SET _parm1=)
IF NOT DEFINED _parm1 shift&GOTO :optlp
FOR %%i IN (%slashopts%) DO IF /i %_parm1%==/%%i SET %%i=Y&(SET _parm1=)
IF NOT DEFINED _parm1 shift&GOTO :optlp
FOR %%i IN (%options%) DO IF /i %_parm1%==-%%i (
SET %%i=%2
IF DEFINED %%i shift&shift&(SET _parm1=)
)
IF DEFINED _parm1 SET badoptions=%badoptions% %1&SHIFT
GOTO :optlp

:readoptionsを少し変更して、または-option anoptionvalueを設定できるようにしたことに注意してください。-switch/slashoption

また、セクションを:readoptionsから最後まで独立したバッチファイルに転送し、readoptions.batそのファイルを任意の場所に配置してpathset pathプロンプトから参照)、任意のバッチを実行できることにも注意してください。

CALL READOPTIONS %*

optionsオプション/スイッチ/スラッシュオプションを変数とバッチswitchesで個別に指定したとおりに読み取るには、残りのパラメーターが含まれます...slashoptsbadoptions

(コロンに関する注意:call:routineparameterlistは'private'パラメーターを使用してINTERNALルーチンをparameterlist 呼び出しますcallroutineparameterlistは'private'パラメーターを使用してEXTERNALルーチンを呼び出しますparameterlist;つまり、[バッチ]ファイル'routine from somewhere on thepath`

goto :eof

物理的なファイルの終わりに移動するための組み込みの機能です。これにより、CALLが終了し、ORに続く行に戻り、バッチを完全に終了します。)。

于 2013-03-18T18:01:59.940 に答える