3

Process を使用して外部プログラムを呼び出そうとしています:

    Dim strExe As String = "E:\Projects\Common Files\mktorrent.exe"
    Dim p As New Process
    Dim pinfo As New ProcessStartInfo
    pinfo.UseShellExecute = False
    pinfo.RedirectStandardOutput = True
    pinfo.Arguments = " -a http://blah.com/announce.php -l " & FileSizeMarker & " " & fn
    pinfo.FileName = strExe
    pinfo.WorkingDirectory = fn.Substring(0, fn.LastIndexOf("\"))
    pinfo.WindowStyle = ProcessWindowStyle.Normal
    pinfo.CreateNoWindow = True
    p.StartInfo = pinfo
    p.Start()

問題はファイル名 (上記の変数 fn) にあります。スペースがある場合、コマンドはチョークします。スペースがないと、正常に機能します。次のように、1、2、または 3 つの引用符を追加してみました。

    fn = Chr(34) & Chr(34) & Chr(34) & fn & Chr(34) & Chr(34) & Chr(34)

そしてまた

    fn = "\") & Chr(34) & fn & "\"& Chr(34)

および他の多くの組み合わせですが、それでもエラーが発生します。これを機能させる方法について何か考えはありますか?ティア

4

6 に答える 6

1

Windowsは、スペースを含む引数を単一の引数として保持する一般的な方法を提供していません。ただし、試した比較的一般的な標準がいくつかあります。

したがって、引数処理mktorrent.exeで使用する引数を決定するか、ファイル名を渡そうとしているときに、スペースを含まないパスに「MSDOS」8.3形式を使用することになります。

後者の場合、この回答はWin32APIを指しGetShortPathNameます。

もちろん、8.3ファイル名は最新のWindowsで無効にすることができます(私が信じているすべてのWindows NTベースのシステム-それはしばしばそうではありません)。したがって、唯一の完全な解決策は、引数処理mktorrentが提供するものを判別することです。

引用符が渡されていないことを示唆するコメントがあるので、このvbscript'testing' 'testing' '1 2 3'の出力に表示されることを確認しました。MsgBox

Option Explicit

Dim arg
Dim line

For Each arg in WScript.Arguments
  line = line & " '" & arg & "'"
Next

MsgBox Trim(line)

以下を使用して実行した場合:

Dim strExe As String = "C:\Windows\System32\wscript.exe"
Dim p As New Process
Dim pinfo As New ProcessStartInfo
pinfo.UseShellExecute = False
pinfo.RedirectStandardOutput = True
pinfo.Arguments = " G:\Utils\Arguments.vbs testing ""testing"" ""1 2 3"""
pinfo.FileName = strExe
pinfo.WorkingDirectory = "G:\Utils"
pinfo.WindowStyle = ProcessWindowStyle.Normal
pinfo.CreateNoWindow = True
p.StartInfo = pinfo
p.Start()

つまりwscript、引用符を見て、スクリプトの3つの引数を累積しています。

ところで、ファイル名の前後に引用符を付けようとする例がfn変数を変更していることに気づきました。.WorkingDirectory変更されていないファイル名を使用する必要がある行でこれに対応しましたか?

于 2012-10-30T06:36:06.483 に答える
1

これにより、スペースを cmd に渡すことができます。何時間もの調査の結果、何も見つかりませんでした。このスレッドは常に発生しています。うまくいけば、これは他の誰かを助けるでしょう.

Dim startprgm As New ProcessStartInfo("cmd.exe", "/C """"C:\Program Files (x86)\Folder\File""""" + strArguments)

4 つの二重引用符がパスを導くことに注意してください。この部分は重要です。引数 (/C) の先頭に 5 つの引用符を付けても機能しませんが、末尾の 5 つを 4 と 1 に分割できます。次のように構造化されています。

Dim startprgm As New ProcessStartInfo("cmd.exe", "/C """"C:\Program Files (x86)""""\Folder\File" + strArguments)

cmd.exe を開いてコマンドを送信するだけの場合、必要なのはパスの最初の引用符だけです (閉じる必要はありません) が、VB は引用符を「閉じる」ために末尾のものを必要とします。

皆さん、頑張ってください。

于 2015-08-12T16:02:31.733 に答える
1

以下のリンクを確認してください。C# で書かれているので、参考になるかもしれません。

Word コマンドライン引数のスペースの問題

于 2012-10-27T08:23:55.937 に答える
1

これは機能します:

Dim current_path, current_rulename, cmd1 as STRING

current_path = "C:\this folder\file name.exe"    
current_rulename = "file name.exe"

cmd1 = "netsh advfirewall firewall add rule name = """ + current_rulename + """ dir = in action = block program = """ + current_path + """"
cmd1 &= " & "
cmd1 &= "netsh advfirewall firewall add rule name = """ + current_rulename + """ dir = out action = block program = """ + current_path + """"
cmd1 &= " & pause"

Process.Start("cmd", "/c " + cmd1)

基本的に、スペースを含む変数は次のように囲む必要があります。

""" + string_with_spaces + """

パーツに分割:

cmd1 = 
"
netsh advfirewall firewall add rule name = 
""" + current_rulename + """
dir=in action=block
program=
""" + current_path + """
"

このコードは、STRINGS をスペースで使用する 2 つの別個のコマンドを結合します。

于 2019-08-22T00:19:56.920 に答える