我有一个控制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呢?求。。。帮助,分全给了!
根据你的最新补充,我怀疑你的问题是出在监听程序上,你是不是没有使用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
: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 ================================方法一结束===============================
: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 ================================方法三结束===============================
: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 关闭回显