2016-11-17 56 views
2

バッチスクリプトでどのようにパラメータを操作するかを学び、引数を読み込むためのテンプレートを作成しましたそしてその後、私はフラグなしで各フラグの機能(arg_/flag)と引数のための1つを作成するパラメータ最後の引数の前方スラッシュは、バッチファイル( "%〜dp0")のディレクトリへのパスを変更させます

@echo off 
SetLocal EnableDelayedExpansion 
set needextra= 
set errstat= 
set noflag= 
set param_f=Not set yet 
set param_g=You didn't use G-flag 

:readARGS 
IF [%1] == [] goto :endARGS 
call :arg_%1 2> nul 
IF ERRORLEVEL 1 call :arg_default %1 
SHIFT 
IF DEFINED needextra (
    set %needextra%=%~1 
    SHIFT 
    set needextra= 
) 
goto :readARGS 
:endARGS 
echo path to directory of batch script: %~dp0 
echo - noflag: !noflag! 
echo - param_f: !param_f! 
echo - param_g: !param_g! 
EndLocal 
exit /b 0 

ディレクトリを表示します最初のエコーは私の質問のために重要である(後述) (arg_default)を設定します:

:arg_/f   -- flag f: set param_f to value of next argument 
set needextra=param_f 
exit /b 0 

:arg_/g   -- flag g: just set the param_g to a value 
set param_g=You used the G-flag 
exit /b 0 

:arg_default  -- default, neither flag f or g: just set the noflag 
echo noflag=%~1 
exit /b 0 
> params "just an arg" 
path to directory of batch script: C:\Users\user\scritpts\ 
    - noflag: just an arg 
    - param_f: Not set yet 
    - param_g: You didn't use G-flag 
> params another /G /F "this is f" 
path to directory of batch script: C:\Users\user\scritpts\ 
    - noflag: another 
    - param_f: this is f 
    - param_g: You used the G-flag 

私は機能にそれを置くことは私がどんな順番でパラメータを入力することができます:私は、バッチファイル内のすべてを置くとき、私は、スクリプトを実行できるのは、C:\Users\user\scripts\params.batを言わせて、パスにディレクトリを置きます私は望むが、私は最後としてG-フラグを置く場合、私はこの奇妙な振る舞いを取得:

> params /F "this is f again" bizar /G 
path to directory of batch script: C:\ 
    - noflag: bizar 
    - param_f: this is f again 
    - param_g: You used the G-flag 

のみC:\%~dp0戻ります!私は他のパラメータでそれを試して、別のディレクトリにバッチファイルを移動し、ディレクトリ内でそれを呼び出すと、%~dp0C:\だけを返し続けました。実際には毎回最後の引数は、「/」%~dp0は、この例のように「奇妙な」振る舞います含まれています。なぜこれが起こっている

> params /G /F stranger "what happens /here" 
path to directory of batch script: C:\Users\user\script\what happens \ 
    - noflag: what happens /here 
    - param_f: stranger 
    - param_g: You used the G-flag 

は、誰かが私に説明していただけますか?私は理由を理解することができず、ウェブ上で何かを見つけることもできませんでした。私はWindows 10を使用しています。

本当にありがとうございます。

答えて

4

を最初~dp0を保存したいですうまくいかない!

Magooが指摘しているように、問題はshiftです。第十引数は%9に保存されているので、デフォルトでは、それは、すべて引数をシフトし、古い%9%8に保存されている...と%1は、現在のバッチファイルへの参照を失う、%0に格納されます。

コードでは、すべての引数が処理されるまですべての引数をシフトします。これは最後の引数を%0の中に残し、この時点では、物事は面白くなります。

%~dp0が要求された場合は、最後の引数はあなたが求めるものを知っていると変数が含まれていassummingそれを解決するために、我々は、引数内で参照される要素のドライブとフォルダを求めるよう、cmd試行を%0内に格納され、ファイルシステム内の要素への有効な参照を絶対パスに変換し、要求された要素を取得します。あなたは2例

  • %0に直面している

    そしてここでは、スラッシュやバックスラッシュのない単純な文字列が含まれています。 cmdは、現在のアクティブディレクトリに格納されているファイル名として扱うため、ドライブとパスを要求すると、現在のアクティブディレクトリのドライブとパスが取得されます。あなたの「作業」のケースでは、

"C:\Users\user\script\just an arg" -> %~dp0 = "C:\Users\user\script\" 
"C:\Users\user\script\this is f" -> %~dp0 = "C:\Users\user\script\" 
  • %0スラッシュやバックスラッシュと文字列が含まれて終わります。同じ文字列には現在のアクティブディレクトリが接頭辞となる相対パス(最初に失敗したケース)が含まれているか、ルートフォルダ(2番目の失敗ケース)からのパスが含まれている場合と同じです。
"C:\Users\user\script\what happens /here" -> %~dp0 = "C:\Users\user\script\what happens " 
"C:/g" -> %~dp0 = "C:\" 

どうすれば解決できますか?

Magooが提案したように、最も簡単な方法は、引数を移動する前に%0引数の値を保存することです。

shiftコマンドをshift /1に変更して、シフトが最初の引数から開始し、%0のままであることを通知することもできます。このオプションのどれもあなたはまだサブルーチン内部から

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    rem Ensure %0 is discarded  
    shift 
    echo %0 

    call :getCurrentBatchFolder dp0 
    echo %dp0% 

    exit /b 

:getCurrentBatchFolder returnVar 
    set "%~1=%~dp0" 
    goto :eof 
+0

あなたの完全な説明をありがとう!私はespaciallyあなたの 'SHIFT/1'ソリューションが好きです。 –

1

コマンドに続いて%~d0が信頼できない可能性があるので、最初はその値を保存します。

This questionの可能性があります。私はまだこの

params "just an arg" 
params another /G /F "this is f" 

作品やこの

params /G /F stranger "what happens /here" 
params /F "this is f again" bizar /G 

は動作しませんが、どちらの場合も、それがないということ...理由...しかし

+0

おかげで多くのことをバッチファイルへの参照を取得することができます使用することができない場合は

。残念ながら私はまだ新しいので、あなたの答えをアップアップすることはできません。あなたのリンクはこの同じ質問にリダイレクトされます:p –

+0

固定リンク..... – Magoo

関連する問題