运行 个空格太多的程序

Run programs with too many spaces

我有一个在命令提示符下运行良好的命令:

CMD /C ""C:\Program Files (x86)\VideoLAN\VLC\VLC" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C Backup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep""

这里我需要CMD /C到return错误级别。

这就是我在 VBScript 中使用 Run 方法尝试 运行 的方式:

WshShell.Run "CMD /C ""C:\Program Files (x86)\VideoLAN\VLC\VLC" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C Backup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep""", 0, False

此命令抛出以下错误:

Expected end of statement (Char: 74)

我看到很多关于 运行ning 程序及其参数路径中有空格的类似问题。我尝试将上面的命令更改为数百个不同的命令,并在答案中看到的不同位置添加更多双引号,但没有任何效果,每次我 运行 脚本时,都会出现以下错误之一:

Expected end of statement
The system cannot find the file/path specified (null)
Unterminated string constant
Expected ")"
Expected "("

如果您遵循 this answer,您会发现字符串中 none 的双引号被转义了。

From A: Not able to launch bat file form VBScript if path contains a space
You just need to escape the quotes in the string correctly, the rule is whenever you want to show a quote in a string double it.

所以该行应该是

WshShell.Run "CMD /C """"C:\Program Files (x86)\VideoLAN\VLC\VLC"" -vvv ""http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSig‌n=c2VydmVyX3RpbWU9NC‌8yNy8yMDE3IDEyO=="" :sout=#file{dst=""F:\Partition C Backup\Downloads\Video\TESTING.mp4"",no-overwrite} :sout-keep""""", 0, False

这将 运行 作为

CMD /C ""C:\Program Files (x86)\VideoLAN\VLC\VLC" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSig‌n=c2VydmVyX3RpbWU9NC‌​8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C Backup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep""

更新

@JosefZ has rightly pointed out in their 原始命令有一个不必要的尾随双引号 ("),所以尽管规则是正确的以获得正确的结果您尝试转义的原始命令必须正确。我根据你的问题做了一个假设;

"I have a command that works fine with command prompt"

原来的命令应该是

CMD /C ""C:\Program Files (x86)\VideoLAN\VLC\VLC" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C Backup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep""

使用这种方法会是

WshShell.Run "CMD /C """"C:\Program Files (x86)\VideoLAN\VLC\VLC"" -vvv ""http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSig‌n=c2VydmVyX3RpbWU9NC‌8yNy8yMDE3IDEyO=="" :sout=#file{dst=""F:\Partition C Backup\Downloads\Video\TESTING.mp4"",no-overwrite} :sout-keep""", 0, False

并导致被执行为

CMD /C ""C:\Program Files (x86)\VideoLAN\VLC\VLC" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C Backup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep"

对:

You just need to escape the quotes in the string correctly, the rule is whenever you want to show a quote in a string double it.

但是,您在原始代码中仍然有不平衡的双引号(多余的尾随 ")。

WshShell.Run "CMD /C """"C:\Program Files (x86)\VideoLAN\VLC\VLC"" -vvv ""http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO=="" :sout=#file{dst=""F:\Partition C Backup\Downloads\Video\TESTING.mp4"",no-overwrite} :sout-keep"""

这将运行作为

CMD /C ""C:\Program Files (x86)\VideoLAN\VLC\VLC" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C Backup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep"

示例 VBScript(特定的可执行文件 cliparserPause.exe 用于 mimic VLC 行为):

option explicit
On Error GoTo 0
Dim strResult: strResult = Wscript.ScriptName
Dim sCmdToRun, WshShell, intReturn

' CMD /C ""D:\bat\Prog Files (x86)\cliparserPause.exe" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C Backup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep"
sCmdToRun = "CMD /C """"D:\bat\Prog Files (x86)\cliparserPause.exe"" -vvv ""http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO=="" :sout=#file{dst=""F:\Partition C Backup\Downloads\Video\TESTING.mp4"",no-overwrite} :sout-keep"""
strResult = strResult & vbNewLine & sCmdToRun

Set WshShell = WScript.CreateObject("WScript.Shell")
intReturn = WshShell.Run( sCmdToRun, 1, true)
strResult = strResult & vbNewLine & Cstr( intReturn )

Wscript.Echo strResult
Wscript.Quit( intReturn )

输出:

==> CMD /C ""D:\bat\Prog Files (x86)\cliparserPause.exe" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C
 Backup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep"
param 0 = D:\bat\Prog Files (x86)\cliparserPause.exe
param 1 = -vvv
param 2 = http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==
param 3 = :sout=#file{dst=F:\Partition C Backup\Downloads\Video\TESTING.mp4,no-overwrite}
param 4 = :sout-keep
press any key to continue...

==> echo %errorlevel%
-1004

==> cscript //NOLOGO D:\VB_scripts\SO649265.vbs
43649265.vbs
CMD /C ""D:\bat\Prog Files (x86)\cliparserPause.exe" -vvv "http://www.foo.com:8085/video.mp4/playlist.m3u8?wmsAuthSign=c2VydmVyX3RpbWU9NC8yNy8yMDE3IDEyO==" :sout=#file{dst="F:\Partition C Bac
kup\Downloads\Video\TESTING.mp4",no-overwrite} :sout-keep"
-1004

==> echo %errorlevel%
-1004

cliparserPause.exe 来源:

#include "stdafx.h"
#include <wchar.h>
#include <cstdio>
#include <stdlib.h>

int main(int argc, wchar_t* argv[])
{
    for (int i = 0; i < argc; ++i)
    {
        wprintf(L"param %d = %S\n", i, argv[i]);
    }
    wprintf(L"press any key to continue...");
    std::getchar();
    exit(-999 - argc);  /* exitcode to OS = ( -1000 -supplied_paramaters_count ) */
    return 0;
}