windows自定义程序服务无法打开bat文件

我有一个控制bat文件重启的系统服务,奇怪的是,一直都打开不了我的bat文件,我用的是cmd.exe /c start c:/test.bat 命令,代码是用java写的。但是,却是可以关闭所有cmd窗口的,我用的命令是 taskkill /f /t /im cmd.exe 为什么会是这样?我做了测试,eclipse中编译运行,都是可以实现的,唯独,做成系统服务却打开不了啦,好郁闷啊
我的系统服务 是使用JavaService 注册的。这个系统服务 做的工作很简单,就是当检测 test.bat在运行过程中不再向指定的log文件中写入的时候,重新启动test.bat文件!在未作为系统服务的时候,是可以关闭test.bat的和重新打开test.bat的,一旦作为了系统服务实时监听的时候,却不能重新打开test.bat了,到底要怎么做才能让我的服务程序打开test.bat呢?求。。。帮助,分全给了!

第1个回答  2013-09-30

根据你的最新补充,我怀疑你的问题是出在监听程序上,你是不是没有使用windows 自带的程序?

关闭和重启的语句写得过于简单了,可能在杀掉cmd的同时,有些依存服务受到了影响.

我建议改一下批处理:仅仅只是杀掉.bat的那个进程.再重新启动.bat批处理文件.建议你好好看下下面的文件.

  有几个问题需要你明确一下:

    你是没有采用windows 自带的:服务控制管理器来启动系统服务么?

    你没有使用instsrv.exe和srvany.exe来创建自定义的windows服务么?

    你的.bat有没有加入程序判断操作系统的,根据不同操作系统来执行?

    要想作为服务启动。bat文件得符合规定的特定格式的。

  你的.bat文件是否成功运行,只是并未显示DOS窗口.

  希望能帮助到你.

  对于1:你可以如下操作

  采用instsrv.exe /srvany.exe

  用instsrv.exe /srvany.exe 注册windows 服务方法:

      1. 注册服务: x:/xxx/instsrv 服务名 x:/xxx/srvany.exe(注意得使用"/")

  -------- 将srvany.exe 注册成系统服务

  2. regedit打开注册表

  3. 进入HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/服务名

  4. 右键-新建-项 填入 Parameters

  5. 打开Parameters,右键-新建-字符串值 Application

  6. 双击Application 填入 应用程序的绝对路径,如: E:/jboss-4.0.5.GA/bin/starteos.bat

  7. 右键-新建-字符串值AppDirectory

  8. 双击AppDirectory 填入 应用程序的工作目录,如: E:/jboss-4.0.5.GA/bin

  ----------- 通过srvany.exe 启动注册表中定义的。exe 应用

  9. 启动服务。

  (注意: 7与8不可或缺)

  在windows 服务管理器中看到定义的服务…

      对于2:你可以采用如下操作:

  第一步:

  下载微软系统小工具 instsrv.exe和srvany.exe至C:\Windows\System32。
第二步:

  运行Dos命令代码:instsrv ServiceName C:\Windows\System32\srvany.exe
    (ServiceName 即你自己定义的服务名称,可以是要作为系统服务启动的应用程序的名称。) 
第三步:

  打开注册表,定位到下面的路径。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName 
    (同样的ServiceName是你刚才安装服务时自定义的服务名称。) 
    如果该服务名下没有Parameters项目,则对服务名称项目右击新建项,名称为Parameters,然后定位到Parameters项,新建以下几个字符串值。 
    名称 Application 值为你要作为服务运行的BAT文件地址。 
    名称 AppDirectory 值为你要作为服务运行的BAT文件所在文件夹路径。 
    名称 AppParameters 值为你要作为服务运行的BAT文件启动所需要的参数。 

注:instsrv ServiceName remove 命令可删除服务。


      对于3:判断WINDOWS 操作系统

  [plain]

  :home

  @echo off

  cls

  @echo  ================= 判断Windows版本 ============================

  rem 选择测试三种方法

  @echo [1]测试方法一

  @echo [2]测试方法二

  @echo [3]测试方法三

  @echo [Q]结束测试
 

  @echo ============================================================

  set /p testa=选择测试方法(记得回车):

  if /i %testa%==1 goto test0

  if /i %testa%==2 goto test1

  if /i %testa%==3 goto test2

  if /i %testa%==Q goto exit

  www.2cto.com

  :test0

  rem ================================方法一===============================

  rem @echo 返回值: isXPlevel=1 XP级别;isXPlevel=2 高于XP级别;isXPlevel=0 低于XP级别

  rem set isXPlevel=0  set isXPlevel=1 &  ,set isXPlevel=2 &

  ver|findstr "5\.[0-9]\.[0-9][0-9]*" > nul && (goto show0)

  ver|findstr "6\.[0-9]\.[0-9][0-9]*" > nul && (goto show01)

  goto show02

  

  :show0

  @echo ---------------- 测试方法一 ------------

  @echo           当前系统是: XP级别

  @echo ----------------------------------------

  goto end

  

  :show01

  @echo ---------------- 测试方法一 ------------

  @echo           当前系统是:高于XP级别

  @echo ----------------------------------------

  goto end

  

  :show02

  @echo ---------------- 测试方法一 ------------

  @echo           当前系统是:低于XP级别

  @echo ----------------------------------------

  goto end

  rem ================================方法一结束===============================

  www.2cto.com

  :test1

  rem ================================方法二===============================

  ver | find "5.0." > NUL &&  goto show50

  ver | find "5.1." > NUL &&  goto show51

  ver | find "5.2." > NUL &&  goto show52

  ver | find "6.0." > NUL &&  goto show60

  ver | find "6.1." > NUL &&  goto show61

  

  :show50

  @echo ---------------- 测试方法二 ------------

  @echo 当前系统是:[ set XT=Windows2000  ]

  @echo ----------------------------------------

  goto end

  

  :show51

  @echo ---------------- 测试方法二 ------------

  @echo 当前系统是:[ set XT=WindowsXP ]

  @echo ----------------------------------------

  goto end

  

  :show52

  @echo ---------------- 测试方法二 ------------

  @echo 当前系统是:[ set XT=Windows2003 ]

  @echo ----------------------------------------

  goto end

  

  :show60

  @echo ---------------- 测试方法二 ------------

  @echo 当前系统是:[ set XT=WindowsVista ]

  @echo ----------------------------------------

  goto end

  

  :show61

  @echo ---------------- 测试方法二 ------------

  @echo 当前系统是:[ set XT=Windows7 ]

  @echo ----------------------------------------

  goto end    www.2cto.com

  rem ================================方法二结束===============================

  

  :test2

  rem ================================方法三结束===============================

  ver | find /i "6.1." > NUL

  if %errorlevel% equ 0 (goto win7)

  

  ver | find /i "5.1."  > NUL

  if %errorlevel% equ 0 (goto winXP)

  

  :NoneTest

  @echo ---------------- 测试方法三 ------------

  @echo 当前系统暂无识别数据,请直接查看系统版本:

  ver

  @echo ----------------------------------------

  goto end

  

  :win7

  @echo ---------------- 测试方法三 ------------

  @echo 当前系统是:Win7!!!

  @echo ----------------------------------------

  goto end

  

  :winXP

  @echo ---------------- 测试方法三 ------------

  @echo 当前系统是:winXP!!!

  @echo ----------------------------------------

  goto end

  rem ================================方法三结束===============================

  www.2cto.com

  :end

  pause

  

  goto Home

  :exit
 

  1.

  用批处理判断操作系统是32位还是64位,并注册install服务。


  @echo off
if /i "%PROCESSOR_IDENTIFIER:~0,3%" == "X86" goto 1 /////通过参数判定操作系统位数,并跳转
if /i "%PROCESSOR_IDENTIFIER:~0,3%" NEQ "X86" goto 2 ///此条语句后面可以改为 EQU "EM6"
:1  /////32位xp注册install服务
%windir%\system32\msiexec.exe /regserver exit


:2  /////64位xp注册install服务
%windir%\syswow64\msiexec.exe /regserver
%windir%\system32\msiexec.exe /unreg
%windir%\system32\msiexec.exe /regserver
exit


  2.用批处理判断操作系统是XP还是WIN7,并执行相应的.bat文件。


  建议用ver配合find来判断 系统版本,就用不着按键盘了。

@ver|find "5.1"
@if errorlevel 1 goto win7
@if errorlevel 0 goto winxp
:winXP
@call winxp.bat
@goto end
:win7
@call win7.bat
@goto end
:end


  2.

  Devcon实现视频设备Driver切换

  。


  @echo off

  set path=%~dp0
set DevconPath=%path?vcon
::set InfPath=%path:~0,-13%st50220.inf
set InfPath=%systemroot%\inf\st50220.inf
echo InfPath=%InfPath%
echo.
::Set WinInf=%systemroot%\inf\usbvideo.inf

  if /i "%PROCESSOR_IDENTIFIER:~0,3%" == "X86" (set devcon=sndc_x86) ELSE (set devcon=sndc_x64)

  cd ?vconPath%

  ?vcon% hwids USB\Vid_0c45* >DevInfo.bat

  (for /l %%a in (1 1 1) do set /p id=)<DevInfo.bat
del DevInfo.bat

  setlocal enabledelayedexpansion
set DevID=!id:~0,21!^&MI_00
echo DevID=!DevID!
echo.

  ::?vcon% update !WinInf! !devID!
?vcon% update !InfPath! !DevID!
echo.
endlocal

  if %errorlevel% equ 0 (goto success) ELSE (goto fail)


:success
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Sonix Driver Update Success!
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
goto end


:fail
echo ~~~~~~~~~~~~~~~~~~~~~~~~~
echo Sonix Driver Update Fail!
echo ~~~~~~~~~~~~~~~~~~~~~~~~~
goto end

  :end
pause

  

  注:这个批处理是调用Devcon工具的处理,得下载devcon工具,具体用devcon help就可以知道它的各种用途。

  代码说明:
1、%~dp0当前所在路径
2、%path?vcon即path字符后面加上devcon字符串
3、path:~0,-13取取path的0至倒数第十三个字符
4、systemroot批处理自动变量。若系统装在c盘,则代表c:\windows
5、echo. 输出空白行
6、"%PROCESSOR_IDENTIFIER:~0,3%" == "X86"  判断系统是否为32位系统
7、?vcon% hwids USB\Vid_0c45* >DevInfo.bat 用deccon的hwids功能,显示包含后面字段的硬件设备,并保存到DevInfo.bat文件中.
>  文件若有,则更新替换现有内容;没有,就创建并保存内容到里面
>> 文件若有,则将新的内容添加在现有内容后面;若没有则创建,并将内容保存至里面。
8、(for /l %%a in (1 1 1) do set /p id=)<DevInfo.bat将DevInfo.bat内容的第一行赋值给id
for里面的变量注意用%%
9、set DevID=!id:~0,21!^&MI_00 将id从0开始前21个字符再加上&MI_00赋值给DevID.
因为&是特殊字符,所以要在前面加转义字符^。
10、有特殊字符的变量必须用""整个括起来,如 set "a=abc&123" echo %a%
还有一种方式就是添加
setlocal enabledelayedexpansion
endlocal
其间的变量就可以含特殊字符,但变量的使用要加!!,本示例就是用的此法。
11、::注释行
12、@取消本行的回显
13、echo on打开回显
    echo off 关闭回显

相似回答