【发布时间】:2021-06-14 04:17:25
【问题描述】:
我们的批处理脚本似乎运行良好,但是我正在编辑其中一个以包含一些新工作,并且当手动运行脚本时(通过从 Windows 资源管理器中双击),每次推送命令时都会收到上述错误消息在脚本中遇到。这些是自年点以来一直存在的推送命令,并且脚本运行良好。 手动运行的批处理脚本和由调度程序启动时有区别吗? 手动运行时如何禁用错误消息(如果可能)?
【问题讨论】:
我们的批处理脚本似乎运行良好,但是我正在编辑其中一个以包含一些新工作,并且当手动运行脚本时(通过从 Windows 资源管理器中双击),每次推送命令时都会收到上述错误消息在脚本中遇到。这些是自年点以来一直存在的推送命令,并且脚本运行良好。 手动运行的批处理脚本和由调度程序启动时有区别吗? 手动运行时如何禁用错误消息(如果可能)?
【问题讨论】:
Windows 文件资源管理器explorer.exe 启动cmd.exe,隐式使用选项/C 以在完成批处理文件执行后关闭命令进程,并在双击批处理文件时将批处理文件目录设置为当前目录。
如果双击的批处理文件在网络共享上并且使用 UNC 路径而不是将网络共享映射到驱动器号并使用网络驱动器,cmd.exe 会通知用户当前目录的 UNC 路径是不支持并将%SystemRoot%(Windows 目录)设置为当前目录。
如果批处理文件设计为从任何目录执行,则可以忽略该警告,这意味着它不需要批处理文件的目录是当前目录。编码好的批处理文件,尤其是那些由 Windows 任务调度程序执行的批处理文件,可以在任何目录作为当前目录的情况下执行。
另请参阅:How can I disable the Universal Naming Convention (UNC) check for command sessions?
可以使用注册表值配置 Windows 命令处理器 cmd.exe 通过在命令提示符窗口中运行来接受当前目录的 UNC 路径:
%SystemRoot%\System32\reg.exe ADD "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v DisableUNCCheck /t REG_DWORD /d 1 /f
请注意,当您启用以 UNC 路径作为当前目录运行批处理文件的支持时,某些控制台应用程序可能会因为不是为该环境而设计而无法运行。
任务调度程序将%SystemRoot%\System32(Windows系统目录)设置为当前目录,然后执行将批处理文件作为调度任务运行的命令,除非将特定目录路径显式设置为start in目录在计划任务的属性中。
在您的情况下,批处理文件设计为作为计划任务执行,因此考虑到我在回答问题What must be taken into account on executing a batch file as scheduled task? 时列出的所有方面,您可以在使用 UNC 双击批处理文件时忽略此警告消息路径。
当然,您也可以为批处理文件创建一个快捷方式文件(*.lnk),以便通过此快捷方式启动批处理文件,并将快捷方式文件属性中的Start in设置为%SystemRoot%\System32就像 Windows 任务调度程序默认做的那样。
【讨论】:
我有一些建议 - 考虑在 PowerShell 中重写您的脚本。 PowerShell 允许当前工作目录位于网络上。 PowerShell 作为一个整体比 CMD 更加通用和强大。它也是跨平台的。考虑切换。
【讨论】: