如何在批处理文件中使用START传递包含在变量中的空格的参数

时间:2012-10-05 15:30:56

标签: variables batch-file cmd

我正在尝试同时启动同一个批处理文件的特定ammount,我在传递参数时遇到了问题。

这是我使用的命令: START "Split lossless enc %%G" "%wrkdir%_menc.bat" "%wrkdir%%avs%_%%G.avs" "%wrkdir%%outf%_%%G.avi" "%menc%" "%mencx%"

%% G是一个数字(在我的测试中从1到4)
%wrkdir%是当前工作目录(所以基本上是%~dp0)
%avs%和%outf%都是没有扩展名的文件名
%menc%是带文件名和扩展名的完整路径 %mencx%是扩展名为

的文件名

其中任何一个都可能包含空格,但它们不在我所做的测试中,因此删除参数的周围引号现在可以完美地工作。

在我完成所有搜索之后,一切都告诉我,只需引用参数就可以解决问题,但我不断收到以下错误:The filename, directory name, or volume label syntax is incorrect.

我已经尝试不使用启动的bat文件中的参数来确保它不是我在那里使用它导致问题(即使我非常怀疑它),但它不起作用,即使它只包含ECHO it works

编辑:我忘了说START是在FOR循环中从1到4并且我使用setlocal enableDelayedExpansion但我使用的所有变量都在它之前设置(%% G除了显然属于FOR)并且在循环之外

Edit2:为了让它更容易,我已经将批处理文件剥离到最低限度(我测试它以确保我得到相同的错误)所以我可以给你整个事情:

@ECHO off

SET wrkdir=%~dp0
SET avs=encode-01
SET menc=D:\_1enc_\_Tools\Mencoder\mencoder_r32198.exe
SET outf=test_mt
SET inst=4

SET mencx=%menc%
:FindMencx
IF NOT "%mencx:*\=%"=="%mencx%" (
  SET "mencx=%mencx:*\=%"
  GOTO FindMencx
)

FOR /L %%G IN (1,1,%inst%) DO (
 START "Split lossless enc %%G" "%wrkdir%_menc.bat" "%wrkdir%%avs%_%%G.avs" "%wrkdir%%outf%_%%G.avi" "%menc%" "%mencx%"
)

2 个答案:

答案 0 :(得分:1)

没有看到带有for循环的整个批处理文件我只能猜测,但尝试在start之后添加一个空白标题,如果没有它,可能会在参数有空格时引起问题。

  

START“”“拆分无损enc %% G”“%wrkdir% menc.bat”“%wrkdir %% avs% %% G.avs”“%wrkdir %% outf%_ %% G.avi“”%menc%“”%mencx%“

答案 1 :(得分:0)

经过大量的反复试验后,当引用的bat文件也被引用并且包含自己的路径时,START命令似乎不能使用带引号的参数。

要解决这个问题,我必须使用/ D选项设置启动目录(之前我从未注意过),如下所示:

START "Split lossless enc %%G" /D"%wrkdir%" "_menc.bat" "%wrkdir%%avs%_%%G.avs" "%wrkdir%%outf%_%%G.avi" "%menc%" "%mencx%"

我还发现当我输入错误的路径时显示相同的错误,因此它似乎由于某种原因看不到它。不知道为什么它可以在没有参数的引号中使用路径和bat文件,也可以使用非引用的文件。

编辑:在我的完整批处理文件中包含修复程序后,我意识到如果启动的批处理文件与当前批处理文件位于同一目录中,则不能用引号括起来,但是如果它位于不同的文件中则可以。这很奇怪。因此,要从同一目录启动它,我需要使用_menc.bat而不是"_menc.bat"

至少它在两种情况下都没有引用,所以这对我来说已经足够了。