Shellが、パスによっては動作しない


FATBOY  2005-05-18 00:55:20  No: 89871

Shellで、自作の実行ファイルを起動するプログラムなのですが、この実行ファイルの格納場所が、Cドライブの直下だと、正しく動作するのですが、これをデスクトップの配下に移動させると、自作の実行ファイルが起動されません。

例:shell( "C:\AAA\PG.exe" )   OK
    shell( "CC:\Documents and Settings\ZZZ\デスクトップ\PG.exe" ) NG

実際には、引数もたくさん付けてshellをコールしています。

当初、思いつきで「\Documents and Settings」の様に、パスにスペースがあるのがダメなのかと思い、パスをダブルコーテーションで囲んでみたのですが、NGでした。

また、下記の様にしてコールしているのですが、特にエラーで返っている様子はありません。

 If Shell(XXX, 1) < 0 Then
     MsgBox "起動失敗"
 End If

厄介なのは、これを複数のPCで試したところ、ちゃんと起動するPCもあり、訳がわからなくなっています。  PCのリソースに依存するのでしょうか?
どのPCでも、確実に動作させる方法があれば、御教示ください。
また、起動しない理由も教えていただければ幸いです。


ガッ  2005-05-18 01:20:12  No: 89872

(´Д`;)<久々に登場しますた。
・とりあえず、「正しく動作しない」というのはどういうことなのかと小一時間問い詰め(ry
・あと、パスをダブルクオートで括ったコードがちょと気になるので、
  コードを載せていただけると嬉しいです。

で、
> shell( "CC:\Documents and Settings\ZZZ\デスクトップ\PG.exe" ) NG
まぁ、typoでしょうが、実際のコードこコピペして修正すればよかったかもしれません。

> これを複数のPCで試したところ、ちゃんと起動するPCもあり、訳がわからなくなっています。
動作の違いは何?
起動しない場合は、無反応になってしまうとか?

> 起動しない理由も教えていただければ幸いです。
色々ありすぎて(orzです。
もしかしたら起動ディレクトリを変えたことによって、
内部で何かが起こっているかもしれません。


ひろ  2005-05-18 02:16:31  No: 89873

> If Shell(XXX, 1) < 0 Then
>     MsgBox "起動失敗"
> End If

If Shell(XXX, 1) = 0 Then

の間違いでは?。ヘルプをちゃんと読みましょう。


じゃんぬねっと  URL  2005-05-18 02:26:06  No: 89874

> shell("C:\Documents and Settings\ZZZ\デスクトップ\PG.exe") NG

半角スペースのせいかな。

Shell("""C:\Documents and Settings\ZZZ\デスクトップ\PG.exe""")

として実験してくださいです。


FATBOY  2005-05-18 03:28:43  No: 89875

みなさん、色々とありがとうございます。

実際のコードはこんな感じです

wstr = """" + T_TERM_EXE + """ " + LOCAL_IP_ADDR + " /W=""" _ 
        + Param_host + """" + " /L=""" + logfile + """" _ 
       + " /K=""" + TERA_EXE + "\KEYBOARD"""

If Shell(wstr, 1) = 0 Then
         MsgBox "起動失敗"
End If

「T_TERM_EXE」というのは、起動したいプログラムのパスです(TeraTermを改造したもの)
「logfile」も、「TERA_EXE」 も、「T_TERM_EXE」と同様に、デスクトップの配下です。

動くPCと、動かないPCの相違は、機種とメモリの違い(384B:動く  256B:動かない)ですね。  どちらもWin2000Proです

If Shell(XXX, 1) = 0 Then  に修正してみましたが、やはりエラー表示はされません。
動かない状況としては、単にシェルが実行されないだけで、他の操作はできます。

見てのとおり、デスクトップの配下で動作させようとすると、Shellに引き渡す文字列は、かなり長くなってしまいます。  これに、制限があるのでしょうか?

みなさん、宜しくお願いします


3−t  2005-05-18 05:49:23  No: 89876

>動くPCと、動かないPC
動くとか動かないという表現が気になるんですが。
エラーメッセージは何ですか?

もしかして起動している実行ファイルの問題じゃないですよね。
同じパスにnotepad.exeとかをコピーして試してみたらどうですか?


oku  URL  2005-05-18 06:39:04  No: 89877

自分は、こうゆう時には下記で言うとwstr変数を
たとえばC:\TEST.BATとかに書き出して、検証します。
wstr = """" + T_TERM_EXE + """ " + LOCAL_IP_ADDR + " /W=""" _ 
        + Param_host + """" + " /L=""" + logfile + """" _ 
       + " /K=""" + TERA_EXE + "\KEYBOARD"""
Dim intFileNo       As Integer
    
intFileNo = FreeFile
Open "C:\TEST.BAT" For Output As #intFileNo
Print #intFileNo, wstr
Close #intFileNo


  2005-05-18 19:41:36  No: 89878

>実際には、引数もたくさん付けてshellをコールしています。
ということだから、
実行される側のプログラムがCommandで受け取っている引数を確認してみては?
スペース入りファイルパスなんかを正しく処理できていない  という可能性はないですか?

それを呼び出し側のShell関数のせいにしていませんか?

と想像してしまう。


  2005-05-18 19:41:37  No: 89879

>実際には、引数もたくさん付けてshellをコールしています。
ということだから、
実行される側のプログラムがCommandで受け取っている引数を確認してみては?
スペース入りファイルパスなんかを正しく処理できていない  という可能性はないですか?

それを呼び出し側のShell関数のせいにしていませんか?

と想像してしまう。


FATBOY  2005-05-19 00:13:03  No: 89880

みなさん、新たな助言、ありがとうございます。
ちょっと、今日、明日はテストができる環境でないので、それ以降にみなさんの助言を試してみます。


papa  2005-05-19 04:41:40  No: 89881

話が横道にそれますが、
文字列の連結に'+’を使うのが気になります。

例えば変数がバリアント型のとき、加算なのか連結なのかあいまいになります。
'&'を使ったほうがよいのでは


FATBOY  2005-05-21 03:53:47  No: 89882

wstr変数の中身をバッチファイルに出力して検証してみたところ、どうやら、コマンドラインの文字列数が256文字を超えるとダメな様です。
動作していた方のPCでは、256文字を超えても大丈夫でした。
とりあえず、階層の深いフォルダでは動作させないという方向で、使っていくつもりです。
一応は、解決のフラグを立てておきますが、こういった制限の回避方法があれば、御教示してもらえると嬉しいです


papa  2005-05-21 18:12:47  No: 89883

GetShortPathName  を使ってパス名を短くするか、
chdir でカレントディレクトリーを変えてパスを指定しなくするってのは


FATBOY  2005-05-28 02:03:58  No: 89884

papaさん、御教示ありがとうございます
どちらも良さそうですね。
試してみます


クラゲ  URL  2005-06-02 05:56:45  No: 89885

8.3準拠にすれば動くと思いますよ。

ロングファイルネームを利用せず、
ショートファイルネームを使ってみてください。

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
(ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long

Private Sub Command1_Click()

Dim sLongPathName  As String
Dim sShortPathName As String * 256
Dim sExecPathName  As String
Dim lRetValue      As Long

sLongPathName = "C:\Documents and Settings\Administrator\デスクトップ\新しいフォルダ\xxxxx.exe"
lRetValue = GetShortPathName(sLongPathName, sShortPathName, Len(sShortPathName))
sExecPathName = Left(sShortPathName, lRetValue)

Call Shell(sExecPathName)

End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加