CMD 执行 BAT 执行 CMD

Posted

技术标签:

【中文标题】CMD 执行 BAT 执行 CMD【英文标题】:CMD to execute BAT to execute CMD 【发布时间】:2015-01-31 20:12:34 【问题描述】:

我正在尝试编写一个脚本,该脚本在目录中搜索特定类型的文件,然后在命令中使用该文件。 .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:\Production\incoming\CHI_TEST_City_Newsstand_4018_North_Cicero_Avenue_60641__\PANO_\1\RAW\DSC_0529_PANORAMA.pts”

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

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

任何帮助将不胜感激!

【问题讨论】:

你确定这会产生所需的结果set real_parent_path=!real_parent_path_unformated:%%20= ^%!。你能回显!real_parent_path!,看看它是否正常? 【参考方案1】:

由于某种原因,您为我们提供了一个不包含潜在目标字符串替换的路径(“%%20”、“%20”或 空格)而且我们不知道您是将字符串提供给“引用”的过程,还是您只是简单地使用了the actual string you are passing 并引用它而不是高亮它。

所以 - 一些猜测。

set real_parent_path_unformated=%1%

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

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

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

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

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

将被解释为

for /R ""a big string"\" %%S in (*.pts) do (

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

下一个问题是

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

由于上述原因,这样比较好

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

但是你用什么来代替不清楚的东西。

% 转义 % 所以 %% 变成 % ^ 不会逃逸 %

如果你想要的话,在字符串替换命令中使用 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 周围的引号是可选的,因为字符串不包含分隔符)应该执行所需的程序。

【讨论】:

以上是关于CMD 执行 BAT 执行 CMD的主要内容,如果未能解决你的问题,请参考以下文章

CMD 执行 BAT 执行 CMD

如何用bat文件执行cmd命令?

bat如何执行完一条cmd命令,然后在同一窗口继续执行别的命令呢?

php怎样执行cmd命令或者bat处理 - 技术问答

cmd执行指定目录下的bat命令

delphi执行cmd