2017-05-24 3 views
1

コマンドプロンプトウィンドウ内から次のバッチスクリプトを実行して、特定のフォルダに移動しています。コマンドプロンプトのバッチファイルの現在のディレクトリを切り替えるのがSETLOCALコマンドを使用して動作しないのはなぜですか?

@echo off 
SETLOCAL 

set ispyfolder=true 
if not "%~1"=="py" if not "%~1"=="pyfolder" set ispyfolder=false 
if "%ispyfolder%"=="true" (
    C: 
    cd C:\Users\ankagraw\AppData\Local\Continuum 
) 

SETLOCALがある場合(2行目)、このコードは機能しません。現在のディレクトリは、コマンドプロンプトウィンドウ内からバッチファイルを実行する前と同じです。この行を削除すると、スクリプトは正常に動作します。

私はスクリプトにgo2という名前を付けました。

go2 pyfolder 

私は誤って地球環境変数を触れないようにSETLOCALを使用したい:だから私はこの方法でそれを呼びたいです。

私は非常に単純な間違いをしていると思います。しかし、私はスクリプティングには新しいので、それを理解することはできません。

+0

「動作しません」という質問はありません。 **スタックオーバーフローに関するよくある質問**を参照してください。 – SteveFest

答えて

3

バッチコードが機能します。実際の問題は投稿ブロックの後に使用されるENDLOCALコマンドが、Windowsコマンドインタープリタによってバッチファイルの他のコマンドが処理される前に使用されていると思います。

ENDLOCALは、バッチファイルの実行を終了する前に、バッチファイルがコマンドプロンプトウィンドウ内から実行されるタイミングを知る上で重要なバッチファイルの場合、Windowsコマンドインタープリタによって暗黙的に実行されます。予想される動作は、すでに実行中のコマンド・プロセスのカレント・ディレクトリをバッチ・ファイルで変更する必要があることです。

私たちは以下の改善バッチコードを見てみましょう:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

set "ispyfolder=true" 
if /I not "%~1" == "py" if /I not "%~1" == "pyfolder" set "ispyfolder=false" 
if not defined LOCALAPPDATA set "LOCALAPPDATA=%USERPROFILE%\AppData\Local" 
if "%ispyfolder%" == "true" echo cd /D "%LOCALAPPDATA%\Continuum" 

rem Other commands in this local environment like the one below. 
echo 1: Current directory is: %CD% 

endlocal 
rem Commands executed in previous environment with previous current directory. 
echo 2: Current directory is: %CD% 

二回set "variable=value"を使用する理由は、最初のバッチファイルの引数を持つ2つの文字列の比較が行われるWhy is no string output with 'echo %var%' after using 'set var = text' on command line?

に答えによって説明される大文字コマンドIFの2回のオプション/Iを使用することにより、この改良されたコードでは非感受性です。

LOCALAPPDATAは、ローカルアプリケーションデータディレクトリを導入して以来、あらかじめ定義されたWindows environment variableです。 Windows XPでは、デフォルトではローカルアプリケーションデータディレクトリが存在しないため、環境変数としてLOCALAPPDATAもありません。しかし、定義されていない場合には、ローカル環境でこの環境変数を定義する行を追加しました。

コマンドCDも、ドライブを変更するオプション/Dを持っています。SETLOCALとENDLOCALコマンドの詳細については、

読むthis answer

コマンドプロンプトウィンドウ内でC:\Users\ankagrawを現在のディレクトリにして、pyまたはpyfolderを最初のパラメータとして使用して、このバッチファイルを実行します。コマンドENDLOCALもカレントディレクトリを復元することをここで見ることができ

1: Current directory is: C:\Users\ankagraw\AppData\Local\Continuum 
2: Current directory is: C:\Users\ankagraw 

:あなたは出力を得ます。そして、これは、コマンドラインがendlocal以下のバッチファイル、またはコマンドプロンプトウィンドウ内から投稿されたバッチファイルを実行しているときに問題になる可能性があります。

解決方法は、コマンドラインendlocalを以下の行に置き換えるか、バッチファイルに他のものが含まれていない場合はこのコマンドラインを追加します。

endlocal & cd /D "%CD%" 

環境変数CDは、最初のコマンドENDLOCALを実行する前に、それの現在の値を使用して、Windowsのコマンド・インタプリタによって、ここで展開されています。だから、実行したコマンドラインpyまたはpyfolderされたパラメータで起動するバッチファイルを使用してコンピュータ上にある:

endlocal & cd /D "C:\Users\ankagraw\AppData\Local\Continuum" 

ENDLOCALは、ローカル環境変数テーブルを削除し、以前の環境変数テーブルを復元し、コマンド拡張機能用の状態を復元遅延拡張と以前のカレントディレクトリも復元します。しかし、次のコマンドCDが実行され、以前のコマンド環境で以前と同じようにカレントディレクトリを再度ディレクトリに変更します。

だから私はあなたのコンピュータ上で使用することをお勧め:そこに次のコマンドを実行し、コマンドプロンプトウィンドウを開き、使用するコマンドとその仕組みを理解するための

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
set "ispyfolder=true" 
if /I not "%~1" == "py" if /I not "%~1" == "pyfolder" set "ispyfolder=false" 
if "%ispyfolder%" == "true" echo cd /D "%LOCALAPPDATA%\Continuum" 
endlocal & cd /D "%CD%" 

、そして完全に表示されるすべてのヘルプページを読みます各コマンドは非常に慎重に。

  • cd /?
  • echo /?
  • endlocal /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
関連する問題