批处理脚本出现“系统找不到指定的路径”错误。

3

我已经写了以下批处理脚本,它在一个目录上运行另一个批处理脚本,或者加上标志后在一个目录树上运行,然后在不同驱动器(Z:)上的等效目录或目录树上运行。无论我选择哪个选项,都会输出错误“系统找不到指定的路径”。如果我只在一个目录上操作,尽管仍会出现错误,但它确实可以按预期执行。它在目录树上无法成功工作。我已尝试删除@echo off以了解其失败原因,但未能成功。它尝试更改的目录确实存在。

@echo off
set origdir=%CD%
if X%~f1==X (
echo Please input a directory.
goto done
)

chdir /d %~f1
for %%X in (myotherscript.bat) do (set FOUND=%%~$PATH:X)
if not defined FOUND (
    echo myotherscript is not in your PATH
    )
if X%2==X/R (
goto recursive
) else ( goto single )

 :recursive     
for /d /r %%G in (.) do call myotherscript
echo Z:%~p1
chdir /d "Z:%~p1"
for /d /r %%G in (.) do call myotherscript
goto ended

:single
call myotherscript
echo Z:%~p1
chdir /d "Z:%~p1"
call myotherscript
goto ended

:ended
chdir /d origdir
goto done

:done
pause

这里是"myotherscript",是的,purge确实存在。

@echo off
if exist "D:\path\to\purge.bat" (
    call purge
    for %%f in (*.log.*) do call :renameit "%%f"
    for %%f in (*.drw.*) do call :renameit "%%f"
    for %%f in (*.asm.*) do call :renameit "%%f"
    for %%f in (*.prt.*) do call :renameit "%%f"
    goto done ) else (
    echo Purge does not exist.
    goto done )

:renameit
ren %1 *.1

:done

非常感谢您的帮助。

谢谢。


2
尝试注释掉 @echo off,这样可以帮助您找出导致“系统找不到指定的路径”的行。 - rojo
啊,所以你又有了一个脚本 purge.bat。你验证过错误不是来自于那个批处理文件吗?顺便说一下,你在调用它时没有使用完整路径。 - Andriy M
另一个脚本也有 @echo off。您也可以将其注释掉,以更精确地找出问题所在。 - Andriy M
当我的路径包含相对路径导航项时,例如“cd ..\xyz”,我会收到该错误消息。 - AnneTheAgile
哦,真丢脸!我的错误是由于我的漏洞引起的...有没有一个脸红的图标? - AnneTheAgile
显示剩余6条评论
2个回答

1
对我来说,由于脚本中缺少一个似乎很晚才出现的exe文件,导致出现了“系统找不到指定的路径”错误。在DOS中,管道并不总是按执行顺序输出数据。我习惯于UNIX中每个脚本中的“echo”命令按顺序输出,所以我在.bat文件中添加了调试输出,试图告诉我哪些行已经执行。
问题是,关于文件未找到的错误出现在输出日志(和屏幕)中比echo命令所示的要早得多。因此,我不知道WinXP cmd shell是否会向前走几步,或者它是否在调用的bat文件启动时解析要调用的exe。
结果证明,实际上是我从调用的bat脚本中运行的.exe文件的路径有误,但echo调试语句让我认为我在脚本的更早部分。一旦我在exe之前添加了正确的路径,所有东西都正常工作了。

1
我不确定为什么这个(非常古老的)问题被重新激活了。但既然它已经被激活,让我们看看能否解决它。
这里似乎有两个问题。首先:
“它输出错误消息:“系统找不到指定的路径。””
这看起来像是在这一行上简单的拼写错误:
chdir /d origdir

没有 '%' 标记,这将尝试更改到一个名为 origdir 的字面目录,而不是运行脚本的原始目录,该目录应该是:
chdir /d %origdir%

第二个问题是:

如果我只在一个目录上执行它,它确实会按照预期进行,尽管它会报错。但是它在目录树上无法成功运行。

猜测原因可能是这一行代码:

if X%2==X/R

"IF" 是区分大小写的。如果你尝试使用 /r 运行此代码,它将无法识别递归请求,并且将始终执行 single

我也不知道为什么它被重新激活了,而且我不能确认这是否是正确的答案(因为它的需求早已过去),但我相当确定它是正确的,所以我会接受它。 - ZackG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接