【问题标题】:System cannot find the patch specified系统找不到指定的补丁
【发布时间】:2016-01-04 05:16:23
【问题描述】:

我有一个每 10 分钟执行一次的 bat 文件。在 cmd 我看到“系统找不到指定的路径”。

有什么想法吗?

下面是代码:

@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

【问题讨论】:

  • 老兄,把“@echo off”注释掉,改成“echo on”,.bat 文件会告诉你找不到什么文件路径!猜测:iexplorer。解决方案:一旦你打开“echo on”并验证它是“iexplorer”,就给它整个路径,例如C:\Program Files\Internet Explorer\iexplore.exe。不要忘记使用引号 (")。
  • 设置dpath 时,会包含引号。然后你的dat 变成"C:\whatever\"logger.log。取出引号并将它们添加到每当您写入文件时,例如。 echo hi 1>>"%dat%".
  • 另外:考虑用比 iexplore 更轻量级的东西代替,比如 curl

标签: batch-file windows-server-2012


【解决方案1】:

您的代码中有几个问题:

  • RLH 已经指出了their answer 中依赖于区域设置的日期/时间格式的潜在问题;从 DPATH 值中删除 \ 也很有意义;
  • 您的引号位置难以处理;我强烈建议始终使用set 语法:set "VAR=Value",这样引号就不会成为变量值的一部分;所以有一个地方可以有效地放置引号:读取(扩展)变量值,例如"%VAR%";这在连接"%VAR%\item" 的情况下特别有用,因此整个表达式都包含在"" 中,并且字符串值中没有干扰引号;
  • 您应该读取同一行或同一代码块中的%DATE%%TIME% 值,以反映同一时间点;使用两个恰好在午夜运行的独立命令行,虽然可能性极小,但可能会导致 %DATE% 返回前一天但 %TIME% 已经返回第二天的情况;
  • 我建议将重定向语法从echo string 1>> "file.ext" 2>&1 反转为1>> "file.ext" echo string,以避免将任何前导空格也输出到文件file.ext;对于echo,您根本不需要2>&1 部分,因为它不会将任何内容输出到STDERR 通道(2),而只会输出到STDOUT 频道 (1);
  • 要使用ping 等待一定的时间,您应该使用一个始终存在的 IP,并在多个回显请求之间使用 1 秒的暂停间隔,因为如果某个不存在的 IP 在某个时候存在,猜测它可能会失败在将来;所以要等待3 秒,您需要4 回显请求有3 个暂停间隔:ping 127.0.0.1 -n 4
  • 你应该为start命令添加一个窗口标题,这样当命令用引号括起来时你就不会遇到问题,因为start将第一个引用的项目视为标题:start "" command;李>
  • 你应该声明exit /B而不是exit,因为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

【讨论】:

    【解决方案2】:

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

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

    收件人:

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

    【讨论】:

    • 这就是我在帖子中所说的。您的本地格式与提供您最初使用的操作的人不同。
    【解决方案3】:

    我猜您的本地日期格式可能与我的不同,并且您无法从操作日期变量中得到想要的结果。

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

    @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\" 附近拥有它们。如果您使用名称生成复杂路径(例如其中的空格),则执行以下操作会更安全:

    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 字符串中,这样更容易查看并知道它是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多