2012-03-25 2 views
1

NSIS 스크립트 빌더의 일부로 files.txt라는 파일에 현재있는 파일 이름 목록이 있습니다. 내용의 예는 나는 그들이이처럼 보이는 끝낼 수 있도록 배치 파일을 사용하여 파일의 목록을 처리하려고배치 파일 NSIS 설치자 용 텍스트 파일 수정

c:\myfolder\assets\startup.xml 
c:\myfolder\assets\begin.exe 
c:\myfolder\assets\begin.swf 
c:\myfolder\assets\resources\assets\text\help.pdf 
c:\myfolder\assets\resources\assets\text\license.rtf 
c:\myfolder\assets\resources\assets\swf\piano.swf 
c:\myfolder\assets\resources\assets\swf\numbers.swf 
c:\myfolder\assets\resources\section1\resource1\item1.jpg 
c:\myfolder\assets\resources\section1\resource1\item2.jpg 
c:\myfolder\assets\resources\section4\resource1\item7.jpg 
c:\myfolder\assets\resources\section4\resource1\item8.jpg 

...

SetOutPath "$INSTDIR" 
File "c:\myfolder\assets\startup.xml" 
SetOutPath "$INSTDIR" 
File "c:\myfolder\assets\begin.exe" 
SetOutPath "$INSTDIR" 
File "c:\myfolder\assets\begin.swf" 
SetOutPath "$INSTDIR\resources\assets\text" 
File "c:\myfolder\assets\resources\assets\text\help.pdf" 
SetOutPath "$INSTDIR\resources\assets\text" 
File "c:\myfolder\assets\resources\assets\text\license.rtf" 
SetOutPath "$INSTDIR\resources\assets\swf" 
File "c:\myfolder\assets\resources\assets\swf\piano.swf" 
SetOutPath "$INSTDIR\resources\assets\swf" 
File "c:\myfolder\assets\resources\assets\swf\numbers.swf" 
SetOutPath "$INSTDIR\resources\section1\resource1" 
File "c:\myfolder\assets\resources\section1\resource1\item1.jpg" 
SetOutPath "$INSTDIR\resources\section1\resource1" 
File "c:\myfolder\assets\resources\section1\resource1\item2.jpg" 
SetOutPath "$INSTDIR\resources\section4\resource1" 
File "c:\myfolder\assets\resources\section4\resource1\item7.jpg" 
SetOutPath "$INSTDIR\resources\section4\resource1" 
File "c:\myfolder\assets\resources\section4\resource1\item8.jpg" 

내가 가지고 ... 다음과 같습니다 몇 가지 시도를했지만 실제로 해결책을 찾지 못했습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

UPDATE

좋아, 나는 약간 아래 배치 파일 ...

dir "c:\n\assets" /b /s > "c:\n\original.txt" 
type "c:\n\original.txt" | findstr \. > "c:\n\filelist.txt" 
@echo off 
setlocal EnableDelayedExpansion 
SET PATH=C:\n 
set INSTDIR="c:\n\assets\" 
(for /F "delims=" %%a in (filelist.txt) do (
    set "filePath=%%~DPa" 
    set "outPath=!filePath:%INSTDIR%=!" 
    if defined outPath set "outPath=\!outPath:~0,-1!" 
    echo SetOutPath "$INSTDIR!outPath!" 
    echo File "%%a" 
) 
) > "c:\n\result.txt" 
REM move /Y c:\result.txt files.txt 

내가 주로 공간을 허용하는 금리 변화의 몇 가지를 만들어을 수정 한 그렇게 Aacini의 게시물에서 진행 NSIS에서 호출 될 때 모든 것이 올바르게 작동하도록 경로를 설정합니다. 내가 지금 직면하고있는 문제는 대신 ....

SetOutPath "$INSTDIR\assets" 
File "c:\my folder\assets\startup.xml" 

내가 얻을 ....

SetOutPath "$INSTDIR\c:\my folder\assets" 
File "c:\my folder\assets\startup.xml" 

내가 이미징 것은 해결하기 정말 쉬운 수정 점이다하지만 난 내 머리를 당겨입니다 그것을 바꾸려고 노력하는 것! 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

NSIS는 File /r "c:\myfolder\" 등으로 디렉토리 트리를 포함 할 수 있지만, 당신이 정말로 텍스트 파일을 구문 분석 할 경우는 다음과 같이 시도 할 수 있습니다 :

;create a file list for this example 
!delfile "$%temp%\testfilelist.txt" 
!appendfile "$%temp%\testfilelist.txt" c:\myfolder\assets\begin.swf$\n 
!appendfile "$%temp%\testfilelist.txt" c:\myfolder\assets\resources\assets\text\help.pdf$\n 
!appendfile "$%temp%\testfilelist.txt" c:\myfolder\assets\resources\assets\text\license.rtf$\n 
!appendfile "$%temp%\testfilelist.txt" c:\myfolder\assets\resources\assets\swf\piano.swf$\n 
!appendfile "$%temp%\testfilelist.txt" c:\myfolder\assets\resources\assets\swf\numbers.swf$\n 
!appendfile "$%temp%\testfilelist.txt" c:\myfolder\assets\resources\section1\resource1\item1.jpg$\n 
!appendfile "$%temp%\testfilelist.txt" c:\myfolder\assets\resources\section1\resource1\item2.jpg$\n 

outfile "$%temp%\test.exe" 
section 
!define srcroot "c:\myfolder\assets" ;batch file needs to generate a relative path for $instdir 
!define filelist "$%temp%\testfilelist.txt" 
!tempfile BATCH 
!tempfile NSH 
!appendfile "${BATCH}.cmd" '@echo off&setlocal&goto main$\n' 
!appendfile "${BATCH}.cmd" ':StrLen$\n' 
!appendfile "${BATCH}.cmd" 'set #=%~2%&set length=0$\n' 
!appendfile "${BATCH}.cmd" ':stringLengthLoop$\n' 
!appendfile "${BATCH}.cmd" 'if defined # (set #=%#:~1%&set /A length += 1&goto stringLengthLoop)$\n' 
!appendfile "${BATCH}.cmd" 'set "%~1=%length%"&GOTO :EOF$\n' 
!appendfile "${BATCH}.cmd" ':writ$\n' 
!appendfile "${BATCH}.cmd" 'setlocal&set "d=%~2"$\n' 
!appendfile "${BATCH}.cmd" 'setlocal enabledelayedexpansion$\n' 
!appendfile "${BATCH}.cmd" 'echo SetOutPath "$INSTDIR!d:~%rlen%!" >>"%~3"$\n' 
!appendfile "${BATCH}.cmd" 'echo File "%~1" >>"%~3"$\n' 
!appendfile "${BATCH}.cmd" 'endlocal&endlocal&GOTO :EOF$\n' 
!appendfile "${BATCH}.cmd" ':main$\n' 
!appendfile "${BATCH}.cmd" 'call :StrLen rlen "%~2"$\n' 
!appendfile "${BATCH}.cmd" 'for /F "usebackq tokens=*" %%A in ("%~1") do call :writ "%%~A" "%%~dpA" "%~3"$\n' 
!system '"${BATCH}.cmd" "${filelist}" "${srcroot}" "${NSH}"' = 0 
!delfile "${BATCH}.cmd" 
!delfile "${BATCH}" 
!undef BATCH 
!include "${NSH}" 
!delfile "${NSH}" 
!undef NSH 
sectionend 
+0

을,하지만 난 프로세스가 파일 목록의 변화와 같은 자동 싶었다. NSIS에서 직접 파일 목록을 생성 할 수 있지만 텍스트 파일의 파일 작업은 내 상황에 더 쉽습니다. – fightstarr20

+0

@ fightstarr20 : 어떻게 자동으로 실행되지 않습니까? (srcroot 부분 제외) – Anders

+0

확실히! appendfile "$ % temp % \ testfilelist.txt"c : \ myfolder \ assets \ begin.swf $ \ n 필요한 파일의 각 새 집합에 대해 변경해야합니다 더하다? – fightstarr20

2

이 배치 파일은 당신이 무엇을해야 :

@echo off 
setlocal EnableDelayedExpansion 
set INSTDIR=c:\myfolder\assets\ 
(for /F "delims=" %%a in (files.txt) do (
    set "filePath=%%~DPa" 
    set "outPath=!filePath:%INSTDIR%=!" 
    if defined outPath set "outPath=\!outPath:~0,-1!" 
    echo SetOutPath "$INSTDIR!outPath!" 
    echo File "%%a" 
) 
) > result.txt 
REM move /Y result.txt files.txt 

먼저 테스트하고 result.txt 파일을 확인하십시오. 모든 것이 정상이면 마지막 명령에서 REM 부분을 제거하십시오.

+0

이 배치 파일은 직접 실행하지만 Excec를 사용하여 NSIS에서 실행하려고하면 result.txt 파일이 생성되지 않습니다. – fightstarr20

2

나는 약간 일괄 수정 한 내 예를 들어 작품을 좋아

dir "c:\n\assets" /b /s > "c:\n\original.txt" 
FOR /F "tokens=3,4 delims=\" %%G IN (original.txt) DO @echo %%G\%%H| tee -a filelist.txt 
@echo off 
setlocal EnableDelayedExpansion 
SET PATH=C:\n\ 
set INSTDIR=C:\n\assets\ 
(for /F "delims=" %%a in (filelist.txt) do (
    set "filePath=%%~DPa" 
    set "outPath=!filePath:%INSTDIR%=!" 
    if defined outPath set "outPath=\!outPath:~0,-1!" 
    echo SetOutPath "$INSTDIR\%%a" 
    echo File "!Path!%%a" 
) 
) > "c:\n\result.txt" 
REM move /Y c:\result.txt files.txt