首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PowerShell中管理基于批处理的服务器

在PowerShell中管理基于批处理的服务器
EN

Stack Overflow用户
提问于 2018-11-07 12:31:26
回答 1查看 83关注 0票数 1

我下载了一个web服务器应用程序的二进制文件。提取它使我拥有以下目录树:

代码语言:javascript
复制
./
   bin/
      start.bat
      stop.bat
   lib/
      *.jar
      *.*

作为PowerShell的粉丝,我宁愿给Start-MyWebServer.ps1打电话,也不愿叫start.bat

如果不是针对start.bat的话,这个任务将很简单:它直接在控制台中写入日志,并要求按一个键继续.退出前(pause?)stop.bat也是如此。

为了在后台启动服务器,我尝试了各种基于Start-Process -FilePath "...\start.bat" -NoNewWindow的解决方案,其中有一个没有-Wait的.

我还试过使用Start-Job

代码语言:javascript
复制
Start-Job -Name "MyWebServer" -ScriptBlock {
   Start-Process -FilePath "...\start.bat" -Wait -NoNewWindow
} | Out-Null

最后一个解决方案几乎是,即当Start-MyWebServer.ps1返回时,服务器仍在初始化,即使作业标记为已完成。我的问题是否有更好的解决方案:在服务器准备就绪之前轮询服务器?还是Start-*命令的预期行为?

以下是start.bat的内容(实际上命名为startup.bat,credit:GeoServer):

代码语言:javascript
复制
@echo off
rem -----------------------------------------------------------------------------
rem Startup Script for GeoServer
rem -----------------------------------------------------------------------------

cls
echo Welcome to GeoServer!
echo.
set error=0

rem JAVA_HOME not defined
if "%JAVA_HOME%" == "" goto trySystemJava

rem JAVA_HOME defined incorrectly
if not exist "%JAVA_HOME%\bin\java.exe" goto badJava

rem Setup the java command and move on
set RUN_JAVA=%JAVA_HOME%\bin\java
echo JAVA_HOME: %JAVA_HOME%
echo.

:checkGeoServerHome
rem GEOSERVER_HOME not defined
if "%GEOSERVER_HOME%" == "" goto noHome

rem GEOSERVER_HOME defined incorrectly
if not exist "%GEOSERVER_HOME%\bin\startup.bat" goto badHome

goto checkDataDir

:trySystemJava
for /f %%i in ('where java') do set RUN_JAVA=%%i
rem --- we might be on amd64 having only x86 jre installed ---
if "%RUN_JAVA%"=="" if DEFINED ProgramFiles(x86) if NOT "%PROCESSOR_ARCHITECTURE%"=="x86" (
    rem --- restart the batch in x86 mode---
    echo Warning: No java interpreter found in path.
    echo Retry using Wow64 filesystem [32bit environment] redirection.
    %SystemRoot%\SysWOW64\cmd.exe /c %0 %*
    exit /b %ERRORLEVEL%
  )
if "RUN_JAVA%"=="" goto noJava
goto checkGeoServerHome

:noJava
  echo The JAVA_HOME environment variable is not defined, and no Java executable could be found.
goto JavaFail

:badJava
  echo The JAVA_HOME environment variable is not defined correctly.
goto JavaFail

:JavaFail
  echo Please install Java or, if present but not in the path, set this environment variable via the following command:
  echo    set JAVA_HOME=[path to Java]
  echo Example:
  echo    set JAVA_HOME=C:\Program Files\Java\jdk8
  echo.
  set error=1
goto end

:noHome
  if exist ..\start.jar goto noHomeOK
  echo The GEOSERVER_HOME environment variable is not defined.
goto HomeFail

:badHome
  if exist ..\start.jar goto badHomeOK
  echo The GEOSERVER_HOME environment variable is not defined correctly.
goto HomeFail

:HomeFail
  echo This environment variable is needed to run this program.
  echo.
  echo Set this environment variable via the following command:
  echo    set GEOSERVER_HOME=[path to GeoServer]
  echo Example:
  echo    set GEOSERVER_HOME=C:\Program Files\GeoServer
  echo.
  set error=1
goto end


:noHomeOK
  echo The GEOSERVER_HOME environment variable is not defined.
goto setHome

:badHomeOK
  echo The GEOSERVER_HOME environment variable is not defined correctly.
goto setHome

:setHome
  echo Temporarily setting GEOSERVER_HOME to the following directory:
  cd ..
  set GEOSERVER_HOME=%CD%
  echo %GEOSERVER_HOME%
  echo.
goto checkDataDir


:checkDataDir
  rem GEOSERVER_DATA_DIR not defined
  if "%GEOSERVER_DATA_DIR%" == "" goto noDataDir
  goto setMarlinRenderer

:noDataDir
  rem if GEOSERVER_DATA_DIR is not defined then use GEOSERVER_HOME/data_dir/
  if exist "%GEOSERVER_HOME%\data_dir" goto setDataDir
  echo No valid GeoServer data directory could be located.
  echo Please set the GEOSERVER_DATA_DIR environment variable.
  echo.
  echo Set this environment variable via the following command:
  echo    set GEOSERVER_DATA_DIR=[path to data_dir]
  echo Example:
  echo    set GEOSERVER_DATA_DIR=C:\Program Files\GeoServer\data_dir
  echo.
  set error=1
goto end

:setDataDir
  set GEOSERVER_DATA_DIR=%GEOSERVER_HOME%\data_dir
  echo The GEOSERVER_DATA_DIR environment variable is not defined correctly.
  echo Temporarily setting GEOSERVER_DATA_DIR to the following directory:
  echo %GEOSERVER_DATA_DIR%
  echo.
goto setMarlinRenderer

:setMarlinRenderer
  cd %GEOSERVER_HOME%
  for /f "delims=" %%i in ('dir /b/s "%GEOSERVER_HOME%\webapps\geoserver\WEB-INF\lib\marlin*.jar"') do set MARLIN_JAR=%%i
  if "%MARLIN_JAR%" == "" (
    echo Marlin renderer jar not found
    goto run
  )
  set MARLIN_ENABLER=-Xbootclasspath/a:"%MARLIN_JAR%" -Dsun.java2d.renderer=org.marlin.pisces.MarlinRenderingEngine
  set JAVA_OPTS=%JAVA_OPTS% %MARLIN_ENABLER%
goto run

:run
  cd %GEOSERVER_HOME%
  echo Please wait while loading GeoServer...
  echo.
  "%RUN_JAVA%" %JAVA_OPTS% -DGEOSERVER_DATA_DIR="%GEOSERVER_DATA_DIR%" -Djava.awt.headless=true -DSTOP.PORT=8079 -DSTOP.KEY=geoserver -jar start.jar
  cd bin
goto end


:end
  if %error% == 1 echo Startup of GeoServer was unsuccessful. 
  echo.
  pause
EN

回答 1

Stack Overflow用户

发布于 2018-11-08 07:54:54

您考虑过捕获start.bat的输出吗?

代码语言:javascript
复制
$psi = New-Object System.Diagnostics.ProcessStartInfo
$psi.FileName = '...\start.bat'
$psi.RedirectStandardOutput = $true
$psi.UseShellExecute = $false
$psi.WindowStyle = 'Minimized'
$bytes = New-Object System.Collections.ArrayList
$s = ''
$enc = [System.Text.Encoding]::ASCII
$done = 'Press any key to continue'
$p = [System.Diagnostics.Process]::Start($psi)
for() {
  $i = $bytes.add($p.StandardOutput.BaseStream.ReadByte())
  if( $bytes[$i] -lt 0 ) { break }
  $s = $enc.GetString($bytes)
  if( $s -match "`n${done}$" ) { break }
}
if( !$p.HasExited ) {
  $p.Kill()
  Write-Host 'done...'
}
$p.Dispose()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53189533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档