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的主要内容,如果未能解决你的问题,请参考以下文章