2017-03-01 7 views
0

私は別のサーバーを選択し、サービスの停止/開始などの操作を実行するオプションを与える.batファイルを作成したいと思います。これまでのところ、システムエラー67が発生しました。ネットワーク名が見つかりません。これを行うより良い方法はありますか?ポップアップオプションからサーバー名を選択することができます。複数のサーバーからサービスを制御するためのバッチファイルの作成

@ECHO OFF 
CLS 
ECHO 1.server1 
ECHO 2.server2 
ECHO 3.server3 
ECHO 4.server4 
ECHO. 

set /p server_name=Enter server name: 

IF %server_name%== 1 GOTO app1 
IF %server_name%== 2 GOTO app2 
IF %server_name%== 3 GOTO app3 
IF %server_name%== 4 GOTO app4 

:app1 
call:restart "server1" 
GOTO End 
:app2 
call:restart "server2" 
GOTO End 

:app3 
call:restart "server3" 
GOTO End 

:app4 
call:restart "server4" 
GOTO End 

:restart 
net use \\%~1/User:%username% 
SC \\%~1 Stop service 
timeout 10 
SC \\%~1 Start service 
GOTO End 

答えて

0

の代わりにあなたのファイルをデバッグ、私はあなたに別の解決策提示したいと思います:あなたは、あなたのサービスがこのbatファイルを作成、再起動するサーバ上で

を:

@ECHO OFF 
:STOP 
SC STOP <your_service> 
ping 127.0.0.1 -n 6 > nul 
SC QUERY <your_service> | find /I "STATE" | find "STOPPED" 
if errorlevel 1 goto :STOP  
SC START <your_service> 

これで、タスクスケジューラを使用してサーバータスクを作成します。トリガを設定しないで、新しく作成したbatファイルをタスクに実行させます。必要なオプション(特定のパスワードを持つ特定のユーザー、誰もログインしていないときにスクリプトを実行するかどうか、admin priveledgesで実行するかどうかなど)とその名前(your_task)を指定します。必要な場合にもSCHTASKSコマンドにユーザー名とパスワードを渡すことができ

@ECHO OFF 
CLS 
ECHO 1.server1 
ECHO 2.server2 
ECHO 3.server3 
ECHO 4.server4 
ECHO. 

:SELECT 
set /p server_name=Enter server name: 

IF %server_name%==1 GOTO app1 
IF %server_name%==2 GOTO app2 
IF %server_name%==3 GOTO app3 
IF %server_name%==4 GOTO app4 
GOTO SELECT 
:app1 
SCHTASKS /RUN /S "server1" /TN "your_task" 
GOTO End 
:app2 
SCHTASKS /RUN /S "server2" /TN "your_task" 
GOTO End 
:app3 
SCHTASKS /RUN /S "server3" /TN "your_task" 
GOTO End 
:app4 
SCHTASKS /RUN /S "server4" /TN "your_task" 
GOTO End 
:End 

最後に、このようなあなたのスクリプトを変更します。

どのように動作するのかは明らかです。最初のバットファイルを詳しく見てみることをお勧めします。これを使用:

SC \\%~1 Stop service 
timeout 10 
SC \\%~1 Start service 

問題が発生する可能性があります。サービスがさまざまな理由から10秒以内に停止することはありません。サービスがまだ停止していない間にサービスを開始しようとすると、エラーが発生し、サービスは停止したままになります。

代わりに、スケジュールされたタスク内のbatスクリプトはサービスを停止しようとしてから5秒間待機します(yes、-n 6は5秒間を意味します^^)。その後、サービスの状態が "STOPPED "そうであれば、それを開始し、そうでなければ、それをやり直すために再試行し、さらに5秒待つなどです。

+0

あなたのよく説明された説明のためにマイケルマイケル。それは非常に有益で、期待どおりに動作します。もう一つ質問があります。私はちょうど興味があります、私のコードでなぜ関数が正しい引数を渡していません。 \%1と書かれているところでは、 "サーバ名"を再起動機能に渡すことを期待しています。私が紛失しているものはありますか? – user2410266

+0

@ user2410266考えられるエラー: 'net use \\%〜1/User:%username%'行には、** 1 **と**/**の間にスペースが必要です。 'net use'コマンドをスキップするだけで動作するかもしれません。 'SC \\%〜1サービスを停止する - タイムアウト10 - SC \\%〜1開始サービスは既にジョブを実行している可能性があります。 – MichaelS

関連する問題