将多个脚本打包到一个.cmd文件中

时间:2013-02-10 06:37:20

标签: batch-file cmd

我编写了一个非常简单(但我认为非常有用)的PowerShell脚本,并以.cmd文件的形式为其创建了一个安装程序。该发行版包含两个.cmd文件和两个.ps1文件。目前是安装程序downloads all required files from github

我的目标是使安装程序自包含,以便人们可以在严格的防火墙后使用它。

一种方法可能是这样的:

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

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

另一种方法是将脚本源代码直接包含在.cmd文件中,使用::begin file1::end file1之类的注释进行标记,然后将其解压缩。但是如何?

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

有什么想法吗?

PS:我知道NSIS,InnoSetup和WiX。我只是希望我的安装程序是文本而不是二进制文件,所以每个人都可以看到它是无害的。

1 个答案:

答案 0 :(得分:0)

当我遇到同样的问题时,为了这个目的,我选择使用既定的标准,而不是设计一个我自己的新术语,所以我选择了XML specification的“资源”元素。这是我的方法:

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

安东尼奥