我正在尝试编写一个脚本,在目录中搜索特定类型的文件,然后在命令中使用该文件。 .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)
非常感谢任何帮助!
答案 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
周围的引号是可选的,因为字符串不包含分隔符)应该执行所需的程序。