我编写了一个非常简单(但我认为非常有用)的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。我只是希望我的安装程序是文本而不是二进制文件,所以每个人都可以看到它是无害的。答案 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>
安东尼奥