在 NSIS 中执行 Powershell
execute Powershell in NSIS
我遇到了以下问题:
我正在尝试在 NSIS 中使用 powershell 脚本,但如果我启动安装程序,则会弹出一个 powershell window 但会立即关闭。
我只能看到 powershell 打印了一个错误(一些红色字母),但由于它立即关闭,我看不到错误的内容。
我的脚本所做的只是替换模板 .xml 文件中的占位符,方法是替换
"CURRENTPC\CURRENTUSERNAME" 使用命令 'whoami' 的输出,最后我将每个 'schtask' 的 XML 文件导入到任务计划程序中。
如果我 运行 我的脚本单独运行,它会按预期工作,但如果我使用编译的设置,就会出现我描述的问题。
当然我会花时间寻找解决方案。
我尝试了以下方法:
我在我的脚本中构建了一个检查以查看它是否 运行s 在 32 位中。如果是,重启64位
我对我的 .xml-模板保留的路径进行了硬编码 'cd'
我通过 'ExecWait'、'ns::ExecToLog' 和 'ns::ExecToStack'
在 NSIS 中执行了 powershell
我不知道该怎么办了。我希望有人能提供帮助。
对于那些想阅读代码的人:
这就是我在 NSIS 中使用脚本的方式:
File ProcessControlTemplateFill.ps1
ExecWait 'powershell -inputformat none -ExecutionPolicy RemoteSigned -File ".\ProcessControlTemplateFill.ps1"'
这是我的.ps1-脚本:
#############################################################################
#If Powershell is running the 32-bit version on a 64-bit machine, we
#need to force powershell to run in 64-bit mode .
#############################################################################
if ($env:PROCESSOR_ARCHITEW6432 -eq "AMD64") {
write-warning "Y'arg Matey, we're off to 64-bit land....."
if ($myInvocation.Line) {
&"$env:WINDIR\sysnative\windowspowershell\v1.0\powershell.exe" -NonInteractive -NoProfile $myInvocation.Line
}else{
&"$env:WINDIR\sysnative\windowspowershell\v1.0\powershell.exe" -NonInteractive -NoProfile -file "$($myInvocation.InvocationName)" $args
}
exit $lastexitcode
}
write-host "Main script body"
#############################################################################
#End
#############################################################################
cd C:\R15
$WERBINICH = whoami
ForEach($Datei in ls './sources/ProcessControlTemplate.xml') {
$Zeilen = Get-Content -Path $Datei.Fullname
$ZeilenZähler = 1
foreach($Zeile in $Zeilen)
{
$Zeile = $Zeile -replace 'CURRENTPC\CURRENTUSERNAME', "$WERBINICH"
Write-Host $Zeile
If($ZeilenZähler -eq 1 ) {
Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force
}
Else {
Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force -Append
}
$ZeilenZähler++
}
}
schtasks /create /f /XML .\sources\ProcessControlTemplate.xml /tn ProcessControl
使用 ProcessControlTemplateFill 的完整路径。ps1,而不是相对路径。在您的 powershell 脚本中使用 Start-Sleep -s 10
暂停一下,以便您可以阅读错误。
我遇到了以下问题:
我正在尝试在 NSIS 中使用 powershell 脚本,但如果我启动安装程序,则会弹出一个 powershell window 但会立即关闭。
我只能看到 powershell 打印了一个错误(一些红色字母),但由于它立即关闭,我看不到错误的内容。
我的脚本所做的只是替换模板 .xml 文件中的占位符,方法是替换 "CURRENTPC\CURRENTUSERNAME" 使用命令 'whoami' 的输出,最后我将每个 'schtask' 的 XML 文件导入到任务计划程序中。
如果我 运行 我的脚本单独运行,它会按预期工作,但如果我使用编译的设置,就会出现我描述的问题。
当然我会花时间寻找解决方案。
我尝试了以下方法:
我在我的脚本中构建了一个检查以查看它是否 运行s 在 32 位中。如果是,重启64位
我对我的 .xml-模板保留的路径进行了硬编码 'cd'
我通过 'ExecWait'、'ns::ExecToLog' 和 'ns::ExecToStack'
在 NSIS 中执行了 powershell
我不知道该怎么办了。我希望有人能提供帮助。
对于那些想阅读代码的人:
这就是我在 NSIS 中使用脚本的方式:
File ProcessControlTemplateFill.ps1
ExecWait 'powershell -inputformat none -ExecutionPolicy RemoteSigned -File ".\ProcessControlTemplateFill.ps1"'
这是我的.ps1-脚本:
#############################################################################
#If Powershell is running the 32-bit version on a 64-bit machine, we
#need to force powershell to run in 64-bit mode .
#############################################################################
if ($env:PROCESSOR_ARCHITEW6432 -eq "AMD64") {
write-warning "Y'arg Matey, we're off to 64-bit land....."
if ($myInvocation.Line) {
&"$env:WINDIR\sysnative\windowspowershell\v1.0\powershell.exe" -NonInteractive -NoProfile $myInvocation.Line
}else{
&"$env:WINDIR\sysnative\windowspowershell\v1.0\powershell.exe" -NonInteractive -NoProfile -file "$($myInvocation.InvocationName)" $args
}
exit $lastexitcode
}
write-host "Main script body"
#############################################################################
#End
#############################################################################
cd C:\R15
$WERBINICH = whoami
ForEach($Datei in ls './sources/ProcessControlTemplate.xml') {
$Zeilen = Get-Content -Path $Datei.Fullname
$ZeilenZähler = 1
foreach($Zeile in $Zeilen)
{
$Zeile = $Zeile -replace 'CURRENTPC\CURRENTUSERNAME', "$WERBINICH"
Write-Host $Zeile
If($ZeilenZähler -eq 1 ) {
Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force
}
Else {
Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force -Append
}
$ZeilenZähler++
}
}
schtasks /create /f /XML .\sources\ProcessControlTemplate.xml /tn ProcessControl
使用 ProcessControlTemplateFill 的完整路径。ps1,而不是相对路径。在您的 powershell 脚本中使用 Start-Sleep -s 10
暂停一下,以便您可以阅读错误。