如果存在,使用cmd防止覆盖文件

时间:2011-07-21 18:02:40

标签: batch-file cmd command-prompt

我目前正在编写一个执行安装文件的.bat批处理文件。在运行安装文件之前,我检查目录是否存在,以避免重新安装应用程序。

我通过使用If Not Exist filename语句来完成此操作。如果安装的文件不存在,我然后执行安装文件。

出于某种原因,当我使用已经安装它的应用程序测试它时,它仍然试图通过它重新安装应用程序。

以下是我的代码片段:

cd "C:\Documents and Settings\John\Start Menu\Programs\"
pause
If NOT exist "Software Folder"\ (
 start \\filer\repo\lab\"software"\"myapp"\setup.exe
 pause
) 

SoftwareFolder"C:\Documents and Settings\John\Start Menu\Programs\".的子目录,我正在检查它是否存在于Programs文件夹中。

我知道我的start命令没有问题。我觉得我的开始CD命令或其中一个参数有问题。

非常感谢,伙计们!

3 个答案:

答案 0 :(得分:44)

使用If Not Exist代码中文件夹的FULL路径。然后你甚至不再需要CD了:

If Not Exist "C:\Documents and Settings\John\Start Menu\Programs\SoftWareFolder\"

答案 1 :(得分:3)

我注意到这个问题可能对刚开始的人或者有点缺乏经验的用户有用。第一...

CD /D "C:\Documents and Settings\%username%\Start Menu\Programs\"

两件事情是CD后的A / D可能证明在确保目录被更改时有用,但实际上并不是必需的,其次,如果您要将此用户传递给用户,则必须添加,而不是你的名字,代码%username%,这使得代码可以在任何计算机上使用,只要它们的setup.exe文件与您在计算机上的位置相同。当然,确保这一点更加困难。 也...

start \\filer\repo\lab\"software"\"myapp"\setup.exe

此处的起始代码可以像这样设置,但正确的语法是

start "\\filter\repo\lab\software\myapp\" setup.exe

这将运行:setup.exe,位于:\ filter \ repo \ lab ...等。\

答案 2 :(得分:3)

正如在Escobar Ceaser的答案中,我建议在整个路径中使用引号。它是将整个路径包装在""中的常用方法,而不仅仅是路径中的单独目录名称。

我有一个类似的问题,它对我没用。但是没有选择使用""在单独的目录名称的路径中,因为路径包含环境变量,它们自己覆盖多个目录层次结构。结论是我错过了结束之间的空间。和(

正确的版本,括号前面的空格,将是

If NOT exist "C:\Documents and Settings\John\Start Menu\Programs\Software Folder" (
 start "\\filer\repo\lab\software\myapp\setup.exe"
 pause
)