CMD执行BAT以执行CMD

时间:2015-01-31 20:12:35

标签: windows batch-file cmd

我正在尝试编写一个脚本,在目录中搜索特定类型的文件,然后在命令中使用该文件。 .bat文件从cmd执行,目录作为参数传递。

@echo off
setlocal enableextensions enabledelayedexpansion

set real_parent_path_unformated=%1%
set real_parent_path=!real_parent_path_unformated:%%20= ^%!

for /R "%real_parent_path%\" %%S in (*.pts) do (
    set /a ptscount+=1
    set ptsfile=!ptsfile! "%%S"
    if !ptscount!==1 (
        START "run PTGUI" /wait cmd.exe /c "S:\Production\CrushFTP7_PC\modules\PTGUI\ptgui.exe -batch -x !ptsfile!"
        set ptscount=0
        set "ptsfile="
    )
)
exit

real_parent_path_unformated =从服务器传递的目录

real_parent_path =已删除%% 20的目录

ptsfile =日志中的完整文件路径示例:

“S:\生产\来电\ CHI_TEST_City_Newsstand_4018_North_Cicero_Avenue_60641 __ \ PANO_ \ 1个\ RAW \ DSC_0529_PANORAMA.pts”

但是,程序没有执行,给我这个错误:

SHGetFolderPath失败:指定的路径无效。 (0xa1)

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

出于某种原因,您为我们提供的路径不包含潜在的目标字符串替换(“%% 20”,“%20”或空间)我们不知道你是否在“引用”的程序中提供字符串,或者你只是简单地引用了the actual string you are passing并引用它而不是将其引用。

所以 - 一些猜测。

set real_parent_path_unformated=%1%

终端%不正确。参数n称为%n。如果要删除封闭引号,请使用~n

批处理对SET语句中的空格敏感。 SET FLAG = N将名为“FLAG Space ”的变量设置为值“ Space N”

语法SET "var=value"(其中value可以为空)用于确保任何杂散尾随空格不包含在分配的值中。 set /a可以安全地使用“无报价”。

在您的代码中,您可能会将引号设置为所分配值的一部分因此,如果real_parent_path包含值"a big string",那么

for /R "%real_parent_path%\" %%S in (*.pts) do (

将被解释为

for / R“”一个大字符串“\”%% S in(* .pts)do(

可能会或可能不会传递错误。它在你的机器上,而不是我的机器上,所以测试只能在理论上进行。

下一个问题是

set real_parent_path=!real_parent_path_unformated:%%20= ^%!

由于上述原因,这更好

set "real_parent_path=!real_parent_path_unformated:%%20= ^%!"

但是你要代替什么不清楚。

  • %转义%%%成为%
  • ^无法逃脱%

在string-substitution命令中使用 Space 是完全可以的,如果那就是你想要的。

最后,可能是ptsfile本身在处理后包含引号,所以"cmd /c...!ptsfile!" would result in“cmd /c..."contents_of_variable_ptsfile”“ - 可能不是你喜欢的。

START "run PTGUI" /wait "S:\Production\CrushFTP7_PC\modules\PTGUI\ptgui.exe" -batch -x !ptsfile!

S:\Production\CrushFTP7_PC\modules\PTGUI\ptgui.exe周围的引号是可选的,因为字符串不包含分隔符)应该执行所需的程序。