ストプロ内でxp_cmdshellを使用し、vbsファイルを実行したいのですが実行できません。
vbsファイルはxp_cmdShellでキックされたらSQLサーバのデータをSELECTし、テキストファイルにSELECTで取得した行数だけ行を追加するという内容です。
vbsファイルはコマンドプロンプトから実行すると動くので正しいと思います。
ストプロにはvbsファイル実行の前後にtableのupdate作業があり、
その2つは行われます。しかし、書き出されるはずのデータがテキストファイルに書き出されません。
vbsファイルは実行されていないようですがエラーは出ず正常終了となり、
xp_cmdshell実行後の戻り値は0で成功となっています。
xp_cmdshellオプションは有効になっており、は混合モードでSysAdminの権限を持つユーザーで処理をしています。
また、ストプロではなく、SQLServerManagementStudioから下記のようにvbsファイル実行しようとした場合、エラーなく正常終了するのですがテキストファイルにデータは追加されていません。
EXEC @result = xp_cmdshell 'Cscript c:\AddRow.vbs'
しかし、EXEC xp_cmdshell 'dir *.exe'は実行できます。
vbsファイルをxp_cmdshell で実行するときは何か特殊な記述が必要なのでしょうか。何がいけないのかわからず困っております。お気づきのことがありましたらご指摘いただけますようお願い致します。
以下にストプロの中身をを記述します。
BEGIN
SET NOCOUNT ON;
-- テーブルのアップデート処理
UPDATE table1 SET Status = 1
WHERE Status = 0
--ファイル書き出しvbsの実行
DECLARE @result int
SET @result = 1
EXEC @result = xp_cmdshell 'Cscript c:\AddRow.vbs'
--ここは下記のようにCscriptを抜いても試しましたがだめでした。
--EXEC @result = exec master..xp_cmdshell 'c:\AddRow.vbs'
IF (@result = 0)
BEGIN
--xp_cmdshellの実行が成功したときのみこの処理に入る予定。
--実際は実行されていないようだが@result が0なのでこの処理を行っている。
UPDATE table1 SET Status = 2
WHERE Status = 1
END
END
No.3
- 回答日時:
理由は3rd_001さんの書かれた内容だろうと思います。
(追加書きしたいテキストは「My Document」の中、なんてことは。。)
補足として。。。
「SSMSから間違えたコードを含むvbsを実行すると実行のまま止まらなくなる」のは、vbsが返す構文エラーのエラーメッセージのメッセージボックスが内部的に表示されっぱなしになるからです(xp_cmdshellはインタラクティブではないので、そのメッセージを見ることはできず、永遠に実行中になる)。
今回のうまく動かないvbsでは、「On Error Resume Next」が切られているでしょうから、実行時エラーの「書き込みできません」というエラーメッセージは出ず(=実行中のまま止まることなく)、正常終了します。
従って、xp_cmdshellからvbsを実行する際に気をつけることは「エラーログを書くこと」でしょうか。
「SSMSから間違えたコードを含むvbsを実行すると実行のまま止まらなくなる」のは、
vbsが返す構文エラーのエラーメッセージのメッセージボックスが内部的に表示されっぱなしになるからなんですね。
永遠に終わらないので何でかと思っていました。
実行時のエラーをログに書くようにします。本当にありがとうございます。
No.1
- 回答日時:
特別な書き方は特に必要ないはずです。
EXEC @result = xp_cmdshell 'c:\AddRow.vbs'
EXEC @result = xp_cmdshell 'CSCRIPT c:\AddRow.vbs'
でも実行できますし、仮にパスが通っていなかったとしたら、エラー(1)が返ります。
どこまで切り分けできているのかわからないのですが、
・SQL Serverはローカルで接続しているのですか?サーバが別にあってリモート接続ですか?
「vbsファイルはコマンドプロンプトから実行すると動くので正しいと思います。」というのは、SQL Serverがあるマシンで確認した結果ですか?
・例えば、以下のような超シンプルなvbsをSQL Serverのあるマシンに置き、SSMSからEXEC xp_cmdshellを実行するとどうなりますか?
Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.CreateTextFile("c:\testfile.txt", True)
a.WriteLine("Test")
a.Close
Set a = Nothing
Set fso = Nothing
ご回答ありがとうございます。せっかくご回答いただいていたのに、返信が遅くなって申し訳ありません。
説明不足だった点ですが、
>・SQL Serverはローカルで接続しているのですか?サーバが別にあってリモート接続ですか?
SQL Serverはローカル接続しています。
>「vbsファイルはコマンドプロンプトから実行すると動くので正しいと思います。」というのは、SQL Serverがあるマシンで確認した結果ですか?
SQL Serverがあるマシンで確認しました。正常に動きます。(テキストファイルに行を追加できる)
また、シンプルなファイル作成のvbsをSQL Serverのあるマシンに置き、
SSMSからEXEC xp_cmdshellを実行したところ、ファイルに内容を書き込むことができました。
また、実際はテキストファイルに行を追加したいので、CreateFileではなくOpenFileで試しましたがこちらも成功しました。
うまく動かないvbsに間違った文法のコードを書き込みSSMSから実行すると、処理が終わらず実行している状態のままになってしまうので、
実行自体はしているようなのですが、ファイルにデータを書き出すことができません。
状況を整理すると、
質問に貼り付けたコードのvbsファイルがコマンドプロンプトから実行するときちんと動く(ファイルに行を追加できる)が、
SSMSからはできない。しかし、エラーフラグは立たず正常終了となる。
SSMSから間違えたコードを含むvbsを実行すると実行のまま止まらなくなるので、実行処理は行っているようである。
ファイルに行を追加するのみのシンプルなvbsはSSMSからも実行できる。
XP_cmdshellからvbsを実行する際、何か気をつけることがあるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Microsoft ASP C#からvbsを実行したい 5 2022/11/24 17:31
- その他(プログラミング・Web制作) VBSでExcelファイル起動時、重複しても開くのを止めたい 1 2022/10/01 23:20
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Windows 10 VirtualBox からWindows XP を起動すると画面が真っ暗になってしまいました 4 2023/07/09 16:19
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel-VBAの「しばらくお待ちく...
-
ユーザー定義関数内でのsp_exec...
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
サーバーと実行端末が違う場合...
-
Access2010のマルチコアCPUへの...
-
UPDATE時のSETの実行順について
-
オラクルインストールユーザ以...
-
同じSQL文で速度がだいぶ違う
-
SQL SERVER エージェントの権限
-
SQLサーバーのジョブでのexeフ...
-
データベース SQL のセッショ...
-
DTexec でSSISパッケージを実行...
-
静的SQL、動的SQL?
-
ストアドの速度がクエリの30...
-
ストアドプロシージャーでバッ...
-
下記の問合せを行うクエリを、P...
-
バッチからメンテナンスプラン...
-
SQLServerのジョブからバッチを...
-
バッチからSQLCMDを実行する方法
-
sqlcmdでクエリの実行結果をバ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
ユーザー定義関数内でのsp_exec...
-
「最高気温が35度以上の日を猛...
-
Excel-VBAの「しばらくお待ちく...
-
ストアドの速度がクエリの30...
-
サーバーと実行端末が違う場合...
-
sqlcmdでクエリの実行結果をバ...
-
Excelフィルタ抽出で「検索して...
-
【Oracle】ADOでSELECT * FROM ...
-
ストアドプロシージャでcsvファ...
-
同じSQL文で速度がだいぶ違う
-
SQLServerのジョブからバッチを...
-
SQLサーバーのジョブでのexeフ...
-
指定時刻のクエリ自動実行
-
バッチからSQLCMDを実行する方法
-
SQL-Loaderが動かないです。
-
UPDATE時のSETの実行順について
-
SQLCMDにて教えていただきたい...
-
バッチからメンテナンスプラン...
-
アクションクエリが実行できない
おすすめ情報