Копирование в batch-файл работает только при втором запуске - PullRequest
0 голосов
/ 26 марта 2019

Моя проблема в том, что файл .bat не копирует существующий файл fileA.mod при первом запуске.Но когда я снова запускаю файл .bat, он копирует файл.

Интересно, что когда файл не содержит условия if, команда копирования работает хорошо в первый раз.

@echo off

:: Run command: SO_script.bat DEV PRE 5617295

:: DEV, TEST or PROD
set TypeOfTask=%1
:: PRE, INTER or POST
set Process=%2
:: Identification number of investigated task
set NoOfTask=%3


if %TypeOfTask%==DEV (

set source=C:\ISPPT\TASK\%NoOfTask%
mkdir C:\AutomaticTests\DEV\%NoOfTask%
set destination=C:\AutomaticTests\DEV\%NoOfTask%

if %Process%==PRE (

copy %source%\fileA.mod %destination%

)
)

1 Ответ

0 голосов
/ 26 марта 2019

Этот вопрос является дубликатом , пожалуйста, не отмечайте этот ответ как принятый.


Я разместил его, чтобы показать вам пример использования отложенного расширения и предложить возможные альтернативы.

Кроме того, он показывает другие лучшие практики, которые вы должны использовать, такие как отступы, правильное комментирование и рекомендуемый синтаксис для установки и сравнения переменных и строк.

@Echo Off
Rem Run command: SO_script.bat DEV PRE 5617295

Rem DEV, TEST or PROD
Set "TypeOfTask=%~1"

Rem PRE, INTER or POST
Set "Process=%~2"

Rem Identification number of investigated task
Set "NoOfTask=%~3"

If "%TypeOfTask%"=="DEV" (
    Set "source=C:\ISPPT\TASK\%NoOfTask%"
    Set "destination=C:\AutomaticTests\DEV\%NoOfTask%"
    SetLocal EnableDelayedExpansion
    MD "!destination!" 2>Nul
    If "%Process%"=="PRE" (
        Copy /Y "!source!\fileA.mod" "!destination!">Nul
    )
    EndLocal
)

Я бы также предложил добавить некую проверку в скрипт, чтобы он получал все необходимые входные параметры в правильном порядке и со значениями, соответствующими допустимым данным.


Если вы используете имена переменных только для целей, показанных в вашем сценарии, вы, конечно, можете вообще не устанавливать ни одну из этих переменных:

@Echo Off
Rem Run command: SO_script.bat DEV PRE 5617295

If "%~1"=="DEV" (
    MD "C:\AutomaticTests\DEV\%~1" 2>Nul
    If "%~2"=="PRE" (
        Copy /Y "C:\ISPPT\TASK\%~1\fileA.mod" "C:\AutomaticTests\DEV\%~1">Nul
    )
)

В качестве альтернативы вы можете установить переменные перед блоком в скобках:

@Echo Off
Rem Run command: SO_script.bat DEV PRE 5617295

Rem DEV, TEST or PROD
Set "TypeOfTask=%~1"

Rem PRE, INTER or POST
Set "Process=%~2"

Rem Identification number of investigated task
Set "NoOfTask=%~3"

Rem Setting source and destination variables
Set "source=C:\ISPPT\TASK\%NoOfTask%"
Set "destination=C:\AutomaticTests\%TypeOfTask%\%NoOfTask%"

If "%TypeOfTask%"=="DEV" (
    MD "%destination%" 2>Nul
    If "%Process%"=="PRE" (
        Copy /Y "%source%\fileA.mod" "%destination%">Nul
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...