3

私は非常に単純な (しかし非常に役立つと信じている) PowerShell スクリプトを作成し、.cmd ファイルの形式でそのインストーラーを作成しました。ディストリビューションには、2 つの .cmd ファイルと 2 つの .ps1 ファイルが含まれています。現在、インストーラーは必要なすべてのファイルを github からダウンロードします

私の目標は、インストーラーを自己完結型にして、厳密なファイアウォールの背後でも使用できるようにすることです。

1 つのアプローチは次のようになります。

echo param(>!filename!
echo     [string] $pfilename>>!filename!
echo )>>!filename!
...

しかし、このアプローチでは特殊文字をエスケープする必要があり、非常に複雑になる可能性があります。その上、便利にするために何らかの方法で自動化する必要があります。

もう 1 つの方法は、スクリプト ソース コードを .cmd ファイルに直接含め、コメントなどでマークして::begin file1から::end file1抽出することです。しかし、どのように?

私の最初の考えは、調べることでしたpl2bat。しかし、行の前のすべてのテキストを削除するperl特別なスイッチ ( ) があり、 によって生成された .bat ファイルはそれ自体で実行されることが判明しました。したがって、使用するのと同じアプローチは使用できません。-x#!perlpl2batperl -xpl2bat

何か案は?

PS: NSIS、InnoSetup、WiX については知っています。インストーラーをバイナリではなくテキストにして、誰もが無害であることを確認できるようにしたいだけです。

4

1 に答える 1

0

この同じ問題に直面したとき、私は独自の新しい用語を考案するのではなく、この目的のために確立された標準を使用することを選択したため、XML 仕様の「リソース」要素を選択しました。これは私の方法です:

@echo off
setlocal EnableDelayedExpansion

rem Extract "FirstSection.txt" and place in its own file:
call :getResource FirstSection > FirstSection.txt

rem Extract "SecondSection.txt" and place in its own file:
call :getResource SecondSection > SecondSection.txt

goto :EOF


:getResource resourceId

rem Resource data start format: ^<resource id="resourceId"^>
set start=
set lines=
for /F "tokens=1,3 delims=:=>" %%a in ('findstr /N "^</*resource" "%~F0"') do (
   if not defined start (
      if "%1" equ "%%~b" set start=%%a
   ) else (
      if not defined lines set /A lines=%%a-start-1
   )
)
set line=0
for /F "skip=%start% tokens=1* delims=]" %%a in ('find /N /V "" ^< "%~F0"') do (
   setlocal DisableDelayedExpansion
   echo(%%b
   endlocal
   set /A line+=1
   if !line! equ %lines% exit /B
)

例えば:

<resource id="FirstSection">
Place here
the contents
of First Section
</resource>

<resource id="SecondSection">
The same
... for Second Section
</resource>

アントニオ

于 2013-02-11T01:29:18.430 に答える