系统找不到指定的补丁
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
我有一个每 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