function Respond($response) { $jsonResponse = $response | ConvertTo-Json try { $writer = New-Object System.IO.BinaryWriter([System.Console]::OpenStandardOutput()) $writer.Write([int]$jsonResponse.Length) $writer.Write([System.Text.Encoding]::UTF8.GetBytes($jsonResponse)) $writer.Close() } finally { $writer.Dispose() } } $jabRefExe = [System.IO.Path]::Combine($PSScriptRoot, "runtime\\bin\\JabRef.bat") try { $reader = New-Object System.IO.BinaryReader([System.Console]::OpenStandardInput()) $length = $reader.ReadInt32() $messageRaw = [System.Text.Encoding]::UTF8.GetString($reader.ReadBytes($length)) $message = $messageRaw | ConvertFrom-Json if ($message.Status -eq "validate") { if (-not (Test-Path $jabRefExe)) { return Respond @{message="jarNotFound";path=$jabRefExe} } else { return Respond @{message="jarFound"} } } if (-not (Test-Path $jabRefExe)) { return Respond @{message="jarNotFound"; output="Unable to locate '$jabRefExe'."} } $messageText = $message.Text.replace("`n"," ").replace("`r"," ") $tempfile = New-TemporaryFile # WriteAllLines should write the file as UTF-8 without BOM # unlike Out-File which writes UTF-16 with BOM in ps5.1 [IO.File]::WriteAllLines($tempfile, $messageText) $output = & $jabRefExe -importToOpen $tempfile *>&1 Remove-Item $tempfile *>$null # For debugging: uncomment the following lines to get the output of JabRef be displayed as a popup #$wshell = New-Object -ComObject Wscript.Shell #$wshell.Popup("Input: $messageText; Output: $output", 0, "JabRef", 0x0 + 0x30) return Respond @{message="ok"; output="$output"} } catch { $err = $PSItem Respond @{message="error"; output="$($err.Exception.Message)"; stacktrace="$($err.ScriptStackTrace)"} # Still print the error to the console so that it is picked up by the browser in addition throw $err } finally { $reader.Dispose() }