系统找不到指定的补丁

System cannot find the patch specified

我有一个每 10 分钟执行一次的 bat 文件。在 cmd 上,我看到 "The system cannot find the path specified".

知道为什么吗?

代码如下:

@ECHO OFF

REM SET DATA, TIME AND PATH

SET DPATH="C:\keepalive\logs\"
SET DATES=%DATE:~7,2%_%DATE:~4,2%_%DATE:~10,4%
SET TIMES=%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
SET DAT=%DPATH%%DATES%.log

REM PRINTING USERNAME
ECHO USER:%USERNAME% 1>>%DAT% 2>&1

ECHO %DATES%%TIMES% 1>>%DAT% 2>&1
ECHO ACCESS WEBSITE 1>>%DAT% 2>&1
START iexplore http://example.com/sitecore/service/keepalive.aspx

ECHO WAITING FOR WEBSITE 1>>%DAT% 2>&1
PING 1.1.1.1 -n 1 -w 20000 >NUL

ECHO CLOSING WEBSITE 1>>%DAT% 2>&1
taskkill /F /T /IM iexplore.exe

EXIT

通过更改下面的代码行修复了它

SET DATES=%DATE:~7,2%_%DATE:~4,2%_%DATE:~10,4%

收件人:

SET DATES=%date:~6,4%%date:~3,2%%date:~0,2%

我猜您的本地日期格式可能与我的不同,您无法通过操作日期变量获得想要的结果。

运行 这在测试批处理文件中:

@echo off
SET DATES=%DATE:~7,2%_%DATE:~4,2%_%DATE:~10,4%
echo %DATES%
pause

通过从 DAT 中删除 %DATES% 字符串进行测试。这仍然会产生相同的错误吗? SET DAT="%DPATH%\TestName.log"

我建议您更改双引号所在的位置。目前你有大约 SET DPATH="C:\keepalive\logs\"。如果您使用名称生成复杂路径(如其中的 space),则执行以下操作会更安全:

SET DPATH=C:\keepalive\logs
SET DATES=%DATE:~7,2%_%DATE:~4,2%_%DATE:~10,4%
SET TIMES=%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
SET DAT="%DPATH%\%DATES%.log"

另外将“\”移动到 DAT 字符串中而不是将其包含在 DPATH 字符串中,这样更容易看到并知道它是正确的。

您的代码中存在几个问题:

  • RLH 已经指出 their answer 中 locale-dependent date/time 格式的潜在问题;从 DPATH 值中删除 \ 也很有意义;
  • 你的引号位置不好处理;我强烈建议始终使用这种 set 语法:set "VAR=Value",这样引号就不会成为变量值的一部分;所以只有一个地方可以有效地放置引号:读取(扩展)变量值,例如 "%VAR%";这在连接 "%VAR%\item" 的情况下特别有用,因此整个表达式包含在 "" 中,并且字符串值中没有令人不安的引号;
  • 你应该阅读同一行或代码块中的 %DATE%%TIME% 值,以便它们反映相同的时间点;使用两个独立的命令行 运行 恰好在午夜,虽然极不可能,但可能会导致前一天 %DATE% returns 但 %TIME% 已经 returns 的情况第二天;
  • 我建议将重定向语法从 echo string 1>> "file.ext" 2>&1 反转为 1>> "file.ext" echo string 以避免任何前导空格也被输出到文件 file.ext;对于 echo 你根本不需要 2>&1 部分,因为它不会向 STDERR 通道(2)输出任何东西,而只是到 STDOUT 频道 (1);
  • 要使用ping等待一定的时间,你应该使用一个一直存在的IP,并且在多个回显请求之间使用1秒的暂停间隔,因为猜测一个non-existing IP可能如果它在未来某个时候存在则失败;所以等待 3 秒,你需要 4 回显请求有 3 个暂停间隔:ping 127.0.0.1 -n 4;
  • 你应该为 start 命令添加一个 window 标题,这样你就不会 运行 在命令用引号括起来时遇到问题,因为 start将第一个引用的项目视为标题:start "" command;
  • 而不是 exit 你应该声明 exit /B,因为 exit /B 退出批处理脚本而 exit 终止包含 cmd 的实例;通过任务调度程序执行时它不会改变任何东西,但是在调试时当 cmd 总是关闭时它可能真的很烦人;

固定代码如下:

@ECHO OFF

REM SET DATE, TIME AND PATH

SET "DPATH=C:\keepalive\logs"
SET "DATES=%DATE%" & SET "TIMES=%TIME%"
SET "DATES=%DATES:~6,4%_%DATES:~3,2%_%DATES:~0,2%"
SET "TIMES=%TIMES:~0,2%_%TIMES:~3,2%_%TIMES:~6,2%"
SET "DAT=%DPATH%\%DATES%.log"

REM PRINTING USERNAME
1>> "%DAT%" ECHO USER:%USERNAME%

1>> "%DAT%" ECHO %DATES%%TIMES%
1>> "%DAT%" ECHO ACCESS WEBSITE
START "" "iexplore" "http://example.com/sitecore/service/keepalive.aspx"

1>> "%DAT%" ECHO WAITING FOR WEBSITE
> NUL PING 127.0.0.1 -n 21

1>> "%DAT%" ECHO CLOSING WEBSITE
taskkill /F /T /IM "iexplore.exe"

EXIT /B