Пакетный файл изменить текстовый файл для установщика NSIS - PullRequest
1 голос
/ 26 марта 2012

Как часть сборщика сценариев NSIS, у меня есть список имен файлов, которые в настоящее время находятся в файле с именем files.txt. Пример содержания ниже ...

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

Я сделал несколько изменений, в основном с кавычками, чтобы разрешить использование пробелов в именах путей, и я также установил путь, чтобы все работало правильно при вызове из NSIS. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что вместо ....

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

Я понял ....

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

Я представляю, что это действительно легко исправить, но я дергаю себя за волосы, пытаясь их изменить! Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Этот пакетный файл делает то, что вам нужно:

@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 из последней команды.

2 голосов
/ 21 мая 2012

Я немного изменил вашу партию:

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
2 голосов
/ 26 марта 2012

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
...