3

我编写了一个非常简单(但我相信非常有用)的 PowerShell 脚本,并以 .cmd 文件的形式为其创建了安装程序。该发行版包含两个 .cmd 文件和两个 .ps1 文件。目前安装程序从 github 下载所有需要的文件

我的目标是使安装程序自成一体,这样人们即使在严格的防火墙之后也可以使用它。

一种方法可能是这样的:

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

但是这种方法需要转义可能变得非常复杂的特殊字符。此外,它需要以某种方式自动化才能有用。

另一种方法是将脚本源代码直接包含在 .cmd 文件中,用注释标记,::begin file1然后::end file1提取它。但是怎么做?

我的第一个想法是调查pl2bat。但事实证明,它perl有一个特殊的开关 ( -x),它只是去掉了行前的所有文本#!perl,并且生成的 .bat 文件pl2bat只是perl -x在自身上运行。所以我不能使用与使用相同的方法pl2bat

有任何想法吗?

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 回答