4

NSISでPowerShellを実行しようとしています。NSISスクリプトを実行すると:

!include "x64.nsh"

Name "nsExec Test"

OutFile "nsExecTest.exe"

ShowInstDetails show

Section "Output to variable"

    nsExec::ExecToStack 'powershell -Command "& {Import-Module }" ServerManager'
    Pop $0 # return value/error/timeout
    Pop $1 # printed text, up to ${NSIS_MAX_STRLEN}
    DetailPrint '"ImportModules" printed: $1'
    DetailPrint "       Return value: $0"

    nsExec::ExecToStack 'powershell -Command "& {Get-WindowsFeature}" Desktop-Experience'
    Pop $0 # return value/error/timeout
    Pop $1 # printed text, up to ${NSIS_MAX_STRLEN}
    DetailPrint '"GetWindowsFeature" printed: $1'
    DetailPrint "       Return value: $0"
SectionEnd

「Import-ModuleServerManager」を実行すると、PowerShellが起動しました(TaskManagerプロセスで確認できます)。しかし、nsExecTest.exeはぶら下がっていました。

私はこの問題をグーグルで検索し、Javaの回避策を見つけました。 https://blogs.oracle.com/vaibhav/entry/not_as_easy_as_we

誰かがNSISでこの問題についての考えを持っていますか?

更新:テストスクリプトを簡略化します。

!include "x64.nsh"

Name "nsExec Test"
OutFile "nsExecTest.exe"
ShowInstDetails show

Section "Output to variable"
${If} ${RunningX64}
    ${DisableX64FSRedirection}

    nsExec::ExecToStack 'powershell.exe "& "Import-Module ServerManager"'
    Pop $0 # return value/error/timeout
    Pop $1 # printed text, up to ${NSIS_MAX_STRLEN}
    DetailPrint '"ImportModules" printed: $1'
    DetailPrint " Return value: $0"
    DetailPrint ""

    ${EnableX64FSRedirection}
${Else}
${EndIf}
SectionEnd
4

2 に答える 2

2

NSIS を使用してからしばらく経ったので、他の場所で見た構文に基づいて推測しています。

nsExec::ExecToStack 'powershell.exe "& "Import-Module ServerManager"'

2 番目のコマンドを取り出し、最初のコマンドでテストして、最初にそれを機能させれば、最初のコマンドが正しいことを確認できます。

< NULまた、あなたや私のコマンドラインの最後に追加してみてください:

nsExec::ExecToStack 'powershell -Command "& {Import-Module }" ServerManager < NUL'
nsExec::ExecToStack 'powershell.exe "& "Import-Module ServerManager" < NUL'

二重引用符で囲む必要があるかどうかはわかりません。インタラクティブに実行しているかのように、入力の提供が完了するのを待っていると、ハングする可能性があります。

http://epeleg.blogspot.com/2010/06/solution-to-powershell-never-exists.html

于 2012-11-15T04:02:45.877 に答える
2

私が知る限り、AaronLSの答えはうまくいきませんでした。ここで報告されたPowerShell v2のバグに関連して、この問題の2つの回避策を見つけました(ただし、修正されていません):

  • PowerShell v3 にアップグレードする
  • NSIS のファイルからスクリプトを実行し、inputformat none. 非常に奇妙な理由で、最後の引用符の前に2 つのnsExec::ExecToStackスペースを残す必要があります。

    SetOutPath "$pluginsdir\NSISTemp"
    File script.ps1
    nsExec::ExecToStack 'powershell -inputformat none -ExecutionPolicy RemoteSigned -File "$pluginsdir\NSISTemp\script.ps1"  '
    

ここに書いたマクロを使えば、あとは${PowerShellExec} "echo 'hello powershell'".

于 2014-01-06T16:01:34.063 に答える