如果在.BAT文件中不存在

时间:2017-01-25 12:39:57

标签: windows batch-file

我正在尝试创建一个只运行和复制文件的.Bat文件,如果文件Startapp.bat退出。当用户在github上提交代码时,会创建此startapp文件。

我有以下脚本。

taskkill /F /IM Webshop.exe

::%~dp0 means the current folder where this .bat is executed from
SET dest=%~dp0productionEnv

IF EXIST "%~dp0startApp.bat" (
    if not exist "%dest%" mkdir "%dest%" 
    xcopy /Y /s "%~dp0Webshop\bin\Debug" "%dest%"
    SET webDest="%dest%/webContent"

    if not exist %webDest% mkdir %webDest% 
    xcopy /Y /s "%~dp0Webshop\webContent\web" %webDest%
    copy /Y "%~dp0startApp.bat" "%dest%/startApp.bat"
    START "" "%dest%/startApp.bat"
    del "%~dp0startApp.bat"
    echo "Deleted startApp.bat"

) ELSE (
    echo "startApp.bat file not found"
)

但它不起作用。有时,它不会回显已删除的消息和未找到文件的消息,而这是不可能的。它应该回应这些消息中的任何一个而不是两者。这就是为什么有一个if else。

请帮忙!

2 个答案:

答案 0 :(得分:1)

我不确定代码中是否有更多错误,但我发现至少有一个错误:

SET webDest="%dest%/webContent"

if not exist %webDest% mkdir %webDest%

因此,如果文件夹不存在,则执行此行:

mkdir %webDest%

其中%webDest%"%dest%/webContent"表示%~dp0productionEnv/webContent

此行会导致错误。在Windows中的路径字符串中有两个可能的分隔符:右边的一个是\而另一个是(但是支持的)/\来自DOS和Windows,/来自UNIX。虽然Windows通常足够智能来解析您的命令,甚至允许您混淆\/mkdir命令也不允许这样做。

这意味着:mkdir C:\some\folder可以使用,但mkdir C:/some/foldermkdir C:\some/folder不会。

编辑:同样适用于xcopy/之后的所有内容都被视为参数,而不是路径的一部分。

答案 1 :(得分:1)

这里有正确的正斜杠固定和不必要的if块更改:

Taskkill /F /IM Webshop.exe

If Not Exist "%~dp0startApp.bat" (
    Echo= startApp.bat file not found
    GoTo Next
)

Rem %~dp0 means the current folder where this .bat is executed from
Set "dest=%~dp0productionEnv"
Set "webDest=%dest%\webContent"

If Not Exist "%dest%" MD "%dest%"
XCopy "%~dp0Webshop\bin\Debug" "%dest%" /Y /S
If Not Exist "%webDest%" MD "%webDest%"
XCopy "%~dp0Webshop\webContent\web" "%webDest%" /Y /S
Copy /Y "%~dp0startApp.bat" "%dest%"
Call "%dest%\startApp.bat"
Del "%~dp0startApp.bat"
Echo= Deleted startApp.bat

:Next