2013-05-06 2 views
0

배치 파일이 있고 배치 파일 내에 특정 디렉토리를 찾고 첫 번째 디렉토리/파일의 이름을 저장합니다. 여기에 내가 뭐하는 거지 대략입니다 :루프에 대한 bat 스크립트는 CL에서 작동하지만 두 번 클릭하면 작동하지 않습니다.

FOR /d %%F IN (%INSTALL_DIR%\dir\*) DO (
    set NAME=%%~xnF 
    set NAME_DIR=%INSTALL_DIR%\dir\%NAME% 
    goto :break 
) 

내가 명령 줄에서이 작업을 실행하면 완벽하게 작동하고 NAME_DIR 올바른 값을 가져옵니다. 그러나 파일을 두 번 클릭하면 NAME 변수가 비어 있습니다. 따라서 NANE_DIR은 % INSTALL_DIR % \ dir로 설정됩니다. 왜 이런 일이 일어나고 그것을 해결하기 위해 무엇을 할 수 있습니까? 더 명확한 설명을 위해

는 명령 줄에서,이 감동 할 때 어떤 NAME 및 NAME_DIR 같다 :

NAME:  dir1.3.8 
NAME_DIR: D:\root\path\to\dir\dir1.3.8 

이 더블 클릭하면 에코되는 것입니다 : RaymondChen가 나에게 말했다 무엇

NAME:  
NAME_DIR: D:\root\path\to\dir 
+0

'NAME_DIR' 명령 줄에서 올바른 값을 가져옵니다에 %NAME% 변경 : 여기에 지연 확장과 새로운 코드는? 멋지다! 'goto : break '줄 앞에'NAME'과'NAME_DIR'의 값을'echo'하고 여기에 출력을 게시하십시오. – Endoro

+0

나는 더 명확하게하기 위해 그것을 추가했다 – user972276

+0

어떤 코드 줄에'echo' 명령을 넣었습니까? – Endoro

답변

2

코멘트가 작동했습니다! 지연된 확장을 사용해야했습니다. 그 이유는 windows가 하나의 명령어로 for 루프를 실행하기 때문에 for 루프를 실행하기 전에 모든 변수를 한 번에 채 웁니다. for 루프 전에 NAME을 설정하지 않았으므로 아무 것도 평가하지 않을 것입니다. 따라서 NAME_DIR은 % NAME % 대신 빈 문자열을 얻습니다. 나는 명령 행에서 스크립트를 처음 실행했을 때 작동하지 않는다는 것을 알아 차렸다. 나는 그것을 다시 돌렸고 효과가 있었다. 나는 계속 실행하고 매번 작동했습니다. 왜냐하면 for 루프를 한 번 실행하면 변수가 저장되고 변경되지 않기 때문입니다. 그래서 다음에 코드를 실행할 때 변수가 더 이상 공백이 아니며 올바른 값을 갖습니다. 이제 두 번 클릭하면 NAME 변수가 처음에 null입니다. for 루프가 실행 된 후 NAME 값이 업데이트됩니다. 스크립트가 실행되고 cmd 창이 종료되면 변수의 새 값이 손실되고 다시 시작됩니다.

setlocal ENABLEDELAYEDEXPANSION 

FOR /d %%F IN (%INSTALL_DIR%\dir\*) DO (
    set NAME=%%~xnF 
    set NAME_DIR=%INSTALL_DIR%\dir\!NAME! 
    goto :break 
) 

내가 SETLOCAL 문에 추가 !NAME!