批处理文件 - IF EXISTS语句"系统无法打开指定的设备或文件。"

时间:2018-03-01 19:12:09

标签: windows batch-file file-exists

我编写了一个批处理文件来卸载有故障的WiFi驱动程序(Intel ProSet Wireless)并在笔记本电脑上设置相应的无线配置文件。此脚本旨在通过Symantec Management Agent远程运行。

代码首先运行组策略更新以适当下拉  来自服务器的网络证书。然后代码检查是否安装了WiFi驱动程序。如果是,则脚本将其卸载。之后,在任何一种情况下,它都会擦除当前的无线配置文件并调用另一个批处理文件来安装相应的无线配置文件。

我的问题是,当我运行脚本时,控制台将报告"系统无法打开指定的设备或文件。"卸载软件后它将终止。 IF EXIST语句检查其中一个软件文件是否存在。

通常,我可以再次运行相同的脚本,并且不会满足IF EXIST案例,因此批处理文件的其余部分将正常工作。

我在下面附上我的代码 - 我正确使用IF EXIST吗?

gpupdate /force
IF EXIST "C:\ProgramData\Package Cache\{552523b2-40ad-46b3-94f6-2b99d0860d5c}\setup.exe" (

cd "C:\ProgramData\Package Cache\{552523b2-40ad-46b3-94f6-2b99d0860d5c}\"
start /wait setup.exe /uninstall

) 

TIMEOUT /T 3 /nobreak >nul
netsh wlan delete profile name=*
cd "C:\Wireless_Settings\"
Mobile_Devices_profile.bat

我研究了其他帖子,我相信我正确使用了这个条件。我没有看到任何其他符合我案例的帖子。它总是正确地检查是否满足条件,但是我不明白为什么程序在卸载软件后终止。我相信应该发生的一切都是不再符合的情况,所以脚本继续。

2 个答案:

答案 0 :(得分:0)

可能的解决方案:(您的if声明似乎是正确的)

pushd之前插入cd语句,在popd之后插入start

这将确保您在if语句调用setup.exe

后返回原始目录
IF EXIST "C:\ProgramData\Package Cache\{552523b2-40ad-46b3-94f6-2b99d0860d5c}\setup.exe" (
PUSHD
cd "C:\ProgramData\Package Cache\{552523b2-40ad-46b3-94f6-2b99d0860d5c}\"
start /wait setup.exe /uninstall
POPD
) 

如果有效,那就好又好。如果没有,则很容易撤消。

当然 - 理论上,您可以将cd更改为PUSHD。有很多路径。

IF EXIST "C:\ProgramData\Package Cache\{552523b2-40ad-46b3-94f6-2b99d0860d5c}\setup.exe" (
PUSHD "C:\ProgramData\Package Cache\{552523b2-40ad-46b3-94f6-2b99d0860d5c}\"
start /wait setup.exe /uninstall
POPD
) 

这应该有用。

现在这很有趣。我确定我以前没有参数使用pushd。文档内容为

  

然后存储当前目录以供POPD命令使用   更改指定的目录。

     

PUSHD [路径| ..]

在缺少选项参数时不明确。

我还注意到,我的批处理开发目录中的dir列表现在列出了一个名为unicode的文件,在正方形之间有空格,而以前它不包含这些空格。也许某些东西已经默默地改变了...... cmd版本的日期是20170929

答案 1 :(得分:0)

Setup.exe正在尝试从包缓存中删除该目录,该目录恰好是您当前的工作目录。对于脚本来说,这不是一个好方法。

foobar

我想补充一点,调试脚本很复杂,因为你有一个多行代码块。你应该不惜一切代价避免这些。如果你可以把它全部放在一行上,最好调用一个子程序。