2017-02-01 1 views
1

우리는 Jenkins를 CI 도구로 사용하고 있습니다. 현재 필자는 메모장 파일 (개발자가 작성한)에서 빌드 값을 가져온 다음 빌드 값을 폴더로 사용하여 네트워크 드라이브에 복사하는 배치 파일을 작성했습니다.배치 파일을 통해 조건부 하위 폴더를 만드는 방법은 무엇입니까?

배치 파일은 아래에 언급

for /f "tokens=2" %%i in ('findstr Build "C:\Program Files (x86)\Jenkins\jobs\**\build.txt"') do set Build=%%i 
    set Build=%Build:'=% 

if not exist "\%Build%\" mkdir "%Build%\" 

내 동기는 이제 메모장의 값이이 폴더를 생성하지 않습니다 6.1 6.A, 소수점 이하 즉 아무것도이지만, 그것을 배치하는 경우이다 6 하위 폴더에. 또는 값이 꽉 찼 으면 상위 폴더가 만들어집니다.

빌드 번호를 얻을 수있는 텍스트 파일은 아래에 나와 있습니다.

#define MyAppVersion '4.0.0.0' 
#define MyFullAppVersion '4.1.0.0' 
#define BuildNumber '81' 

"빌드 번호"에 입력 된 값을 기준으로 폴더를 만들어야합니다. 값이 십진수이면 하위 폴더 내에 만들어야하며, 그렇지 않으면 기본 폴더 만 있어야합니다.

아래 입력을 통해이 파일을 생성하기 위해 배치 파일을 만들었지 만 작동하지 않았습니다.

for /f "tokens=2" %%i in ('findstr Build "C:\Folder Check\logs\build.txt"') do set Build=%%i 
set Build=%Build:'=% 

for /F "tokens=2""delims=." %%j in ('findstr Build "C:\Folder Check\logs\build.txt"') do set "sub=%%j" 

if exist "\\network\%Version%\%Build%\" mkdir "\\network\%Build%\%sub%%" 

if not exist "\\network\%Version%\%Build%\" mkdir "\\network\%Version%\%Build%\" 

if exist "\\network\%Version%\%Build%\%sub%%j" XCOPY /y "C:\Program Files (x86)\Notepad++\readme.txt" "\\network\%Version%\%Build%\%sub%\" /E /S 

if not exist "\\172.19.0.4\Departement$\Development\Development RCX\RCX_M02_CSP\INTERNAL RELEASES\CI\%Version%\%Build%\%sub%%" XCOPY /y "C:\Program Files (x86)\Notepad++\readme.txt" "\\network\%Version%\%Build%\" /E /S 

모든 도움을 주실 수 있습니다. 더 때문에, 또한 내가 일반적으로 권장 하나 인 인용 set 구문을 살펴보십시오

for /F "delims=." %%j in ("%Build%") do set "Build=%%j" 

:

+0

"메모장 파일"은 무엇입니까? * 텍스트 파일 *입니다. 맞습니까? – aschipfl

+0

텍스트 파일입니다. 이 메모장 파일에 작성된 # define MyAppVersion '4.0.0.0' #define MyFullAppVersion '4.1.0.0' #define BuildNumber '4'. for 명령을 사용하여 개발자가 언급 한 값을 얻습니다. – writerrajiv

+0

질문에 텍스트 샘플을 포함 시키십시오! – aschipfl

답변

0

당신은 뒤에 기간 . 모든 것을를 분할하려면 다음 코드를 사용하지 수 특수 문자로 인해 문제가 발생할 수 있습니다.

if exist 구문이 약간 이상하게 보입니다. 존재 확인 중에 \ 앞에 오기 때문에 디렉토리 %Build%의 위치를 ​​알 수는 없지만 작성 중에는 확인하지 않습니다. 당신이 디렉토리가 현재 작업 디렉토리에 존재 확인하려면, 선행하지 않는 \ :

if not exist "%Build%\" mkdir "%Build%" 

당신이 다음 \하여 앞에 않으며, 현재 드라이브 OD 루트 디렉토리에 위치 할 경우 , 그러나 이것은 당신이 원하는 것이 아닙니다.

그러나 \이 추가되어야 디렉토리가 존재하는지 확인해야합니다. 파일을 제공하지 않으면 파일도 검사합니다.

어쨌든

, 디렉토리는, 존재를 확인 할 필요가 없습니다 그냥 디렉토리가 다음과 같이 존재하는 경우에 나타나는 오류 메시지를 생성 억제 할 수 있는지 확인합니다 :

mkdir "%Build%" 2> nul 

당신은 글로벌 와일드 카드 ( *, ?)를 사용할 수 있습니다 ... 난 당신의 경로 지정 오른쪽에있는 **을 해석하는 경우 잘 모르겠지만, 난 당신이 알려하려고 가정합니다 마지막으로 경로의 요소이므로 C:\Program Files (x86)\Jenkins\jobs\**\build.txt은 유효하지 않습니다. C:\Program Files (x86)\Jenkins\jobs\에서 단 하나의 디렉토리가있을 경우,이 같은 그것을 얻을 수 있습니다

for /F "eol=: delims=" %%D in (' 
    dir /B /A:D /O:D "C:\Program Files (x86)\Jenkins\jobs\*" 
') do set "SubDir=%%D" 
:

for /D %%D in ("C:\Program Files (x86)\Jenkins\jobs\*") do set "SubDir=%%~D" 

여러 디렉토리가있는 경우 그리고 마지막 하나를 수정 싶어, 당신은이를 사용할 수 있습니다

+0

확인. 이제는/f "tokens = 2"%% i ('findstr Build "C : \ Program Files (x86) \ Jenkins \ jobs \ build.txt"')의 스크립트를 다음과 같이 설정하십시오 : Build = %% i 빌드 = % 빌드 : '= % /F "delims =." %% j in ("% Build %")은 "Build = %% j"를 설정합니다. 그런 다음 xcopy를 사용하여 파일을 복사하면 폴더가 만들어집니다. 값이 6,7이면 폴더를 만듭니다. 또는 개발자가 입력 한 값이 십진수 (예 : 6.5) 인 경우 이름이 6.5 인 폴더에 폴더가 만들어지고 사본이 실행됩니다. – writerrajiv

+0

일반적으로 : 질문에 대한 요구 사항을 변경하지 마십시오. 이미 사용 가능한 답변이 유효하지 않습니다! 대신에 새로운 질문을하십시오! 그래서 기본적으로'Build'가'6.5'를 가지고 있다면'6' 폴더 안에 하위 폴더'6.5'가 추가로 필요합니다.'Build'가'6'을 가지고 있다면 하위 폴더는 없습니까? – aschipfl

+0

예. 그러나 위의 정보는 똑같이 중요했습니다. – writerrajiv

관련 문제