2012-06-18 3 views
0

배치 파일을 작성하여 3 개의 데이터를 입력하고이 데이터를 사용하여 다른 배치 파일을 작성하려고합니다. 그냥 만들고 중지하십시오. 이 배치는 사용자를 위해 여러 네트워크 드라이브를 매핑합니다. 사용자는이를 수행하는 방법에 대한 단서를 제공하지 않습니다.
나는 "master.bat"을 가지고 있고 "username" "Password"와 "drive path"를 채우기 위해 "replace"를 사용하는 메모장을 사용하고 있습니다. 해당 사용자에 대해 "custom.bat"을 만드는 "master.bat"에 변수를 입력하는 방법을 생각해 냈습니다.
저는 여기서 마지막 단계로 들어가는데 많은 도움을 받았습니다. 마지막 부분을 제외한 모든 것이 작동합니다. 이제는 모든 변수와 템플리트를 넣었으니, 첫 번째 배치 파일을 cuctomized 출력을 작성하여 실행 가능한 파일로 만들려면 어떻게해야합니까?배치 파일의 입력을 사용하여 새로운 이름 배치 파일로 저장

답변

2

한 가지 방법은 실제 값으로 파일 형태로 템플릿을 사용하고 거기에 자리를 대체하는 것입니다 :

setlocal enabledelayedexpansion 
for /f %%L in (template.cmd) (
    set "Line=%%L" 
    set "Line=!Line:[username]=!username!" 
    ... 
    >network-drives.cmd echo !Line! 
) 

이 정의 된 템플릿과 해당 변수 [username] 같은 자리를 가정합니다.

그러나 배치에서 파일에서 읽은 데이터를 사용하면 항상 불안해집니다.

(
    echo @echo off 
    echo net use !drivepath! \\server\share "/user:!username!" "!password!" 
    echo net use !drivepath2! \\server\share2 "/user:!username!" "!password!" 
) > network_drives.cmd 

케어 당신이 생성 된 배치 파일에서해야 할 수도 있습니다 구문 예약 닫는 괄호 여러 문자 같은 것들로주의가 필요하다 : 나는 최근에 서로 배치 파일을 만들 수 있었을 때 나는 다음과 같은 경로를 갔다. 그러나 이러한 접근 방식은 유지하기가 조금 더 힘들지만 완전히 자체 포함되어 있습니다.

+1

템플릿으로 줄을 시작,하지만 조이가 언급 한 바와 같이 배치 파일의 각 줄을 구문 분석을 통해 데이터를 교환하는 것은, 특정 문자를 제거 할 수 있습니다. 나는 템플릿 슬레이브 배치 파일을 끝에 빈 라벨과 함께 사용할 것이다 -': SET_VARS'는 이전에 슬레이브에서 프로 시저로 호출되었다. 마스터 배치에서 나는 변수 할당만을 슬레이브에 추가 할 것이다. 두 개의'set' 명령과 변수 이름과 값이 뒤 따른다. – Helbreder

+0

좋은 옵션이기도합니다. 새로운 파일을 생성 한 후'copy'를 사용하여 변수 정의를 처음부터 붙일 수도 있습니다. – Joey

+0

닫는 괄호 또는 다른 특수 문자와 관련된 문제를 방지하려면 퍼센트 확장 대신 지연된 확장을 사용해야합니다. net_drives.cmd' – jeb

1

배치 파일 내에 템플릿을 포함시키는 것이 간단합니다. 이를 수행하는 방법은 여러 가지가 있습니다. 하나는 각 템플리트 행 앞에 ::: 접 두부를 붙이는 것입니다. :은 이미 배치 레이블로 사용되고 ::은 배치 주석으로 자주 사용되기 때문에 해당 순서를 선택했습니다.

지연된 확장을 사용하면 검색을 수행하고 자동으로 바꿀 수 있습니다!

출력물에 포함하려는 경우 걱정할 필요가있는 특수 문자가 3 개뿐입니다. 이러한 특수 문자는 원래 질문에 필요하지 않을 수도 있습니다. 그러나 일반적인 의미에서 어떻게 다루는지를 아는 것이 좋습니다.

느낌표 문자 ! 시작해야 함 도주 또는

^ 리터럴 캐럿이 탈출하거나 느낌표가있는 줄에 나타나는 경우 대체 할 수

교체. 그러나 선상에 느낌표가 없으면 탈출해서는 안됩니다. 캐럿 대체는 항상 안전합니다.

사용의 대체는 매우 좋아 보인다 :

@echo off 
setlocal 

::The following would be set by your existing script code 
set drivePath=x: 
set username=rumpelstiltskin 
set password=gold 

::This is only needed if you want to include ! literals using substitution 
set "X=!" 

::This is only needed if you want to include^literal on same line 
::containing ! literal 
set "C=^" 

::This is only needed if you want to start a line with : 
set ":=:" 

::This is all that is needed to write your output 
setlocal enableDelayedExpansion 
>mapDrive.bat (
    for /f "tokens=* delims=:" %%A in ('findstr "^:::" "%~f0"') do @echo(%%A 
) 

::----------- Here begins the template ----------- 
:::@echo off 
:::net use !drivePath! \\server\share "/user:!username!" "!password!" 
:::!:!: Use substitution to start a line with a : 
:::!:!: The following blank line will be preserved 
::: 
:::echo Exclamation literal must be escaped ^! or substituted !X! 
:::echo Caret with exclamation must be escaped ^^ or substituted !C! 
:::echo Caret^without exclamation must not be escaped 
관련 문제