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

问题描述 投票:0回答:2

我已经编写了一个批处理文件来卸载有故障的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

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

windows batch-file file-exists
2个回答
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


0
投票

Setup.exe正在尝试从包缓存中删除该目录,该目录恰好是您当前的工作目录。不是脚本生活的好方法。

@setlocal ENABLEEXTENSIONS
@rem @set prompt=$G

@set "_setupExe=C:\ProgramData\Package Cache\{552523b2-40ad-46b3-94f6-2b99d0860d5c}\setup.exe"

@gpupdate /force
@if exist "%_setupExe%" call %_setupExe% /uninstall

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

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

© www.soinside.com 2019 - 2024. All rights reserved.