В настоящее время я использую Круиз-контроль, чтобы планировать «сборки» для различных внутренних веб-сайтов. Я использую командные файлы для запуска каждой из этих «сборок» (сборка означает определенный вывод веб-справки). Допустим, в качестве примера, у нас есть сборки, помеченные как Internal, External и Public. Внутри мастер-файла вы найдете следующий код:

if x%TargetName:-Internal-=%==x%TargetName%  goto ReplaceNav
if x%TargetName:-External-=%==x%TargetName% goto SkipSearch 
if x%TargetName:-Public-=%==x%TargetName% goto SkipSearch
:: do not uncomment or the skin will not get copied to the output

Итак, позвольте мне объяснить, что здесь происходит .. Переменная% TargetName% уже имеет значение до запуска этой части сценария. Переменная% TargetName% будет содержать текст -Internal, -External или -Public и будет содержать другие символы в начале или конце каждого целевого имени, но я хочу иметь возможность использовать условный оператор, если скрипт видит -Internal в переменной% TargetName%, затем сценарий будет переходить к блоку кода с меткой:ReplaceNav. Вот что:ReplaceNav выглядит так.

:ReplaceNav
echo.
echo -----------------------------------------------------------------
echo Replacing Navigation.htm and Search.htm files
echo TargetName is %TargetName%
echo CurrUser is %CurrUser%
echo -----------------------------------------------------------------
echo.

pushd ..\..\some\dir\MasterPages

    copy /y "Navigation1.COPY" "..\..\..\Output\%CurrUser%\%TargetName%\Skin\Navigation.htm" 2>&1
    IF %ERRORLEVEL% NEQ 0 (
        echo.
        echo Failed to replace Navigation.htm file with Exit Code: %ERRORLEVEL%
        echo.
        exit /b %ERRORLEVEL%
    )
    copy /y "Search.COPY" "..\..\..\Output\%CurrUser%\%TargetName%\Skin\Search.htm" 2>&1
    IF %ERRORLEVEL% NEQ 0 (
        echo.
        echo Failed to replace Search.htm file with Exit Code: %ERRORLEVEL%
        echo.
        exit /b %ERRORLEVEL%
    )
popd

ReplaceNav по существу заменяет два файла в выводе веб-справки на две пользовательские страницы, содержащие поисковую систему, доступную только для внутренних пользователей.

Если переменная% TargetName% содержит -External или -Public, пакетный файл ДОЛЖЕН перейти в раздел:SkipSearch пакетного файла.

:SkipSearch
echo.
echo -----------------------------------------------------------------
echo Skipped Search and Navigation Replacement
echo -----------------------------------------------------------------
echo.

Моя проблема заключается в следующем (и я почти уверен, что это связано с неправильной структурой оператора IF): Как мне структурировать этот блок кода

if x%TargetName:-Internal-=%==x%TargetName%  goto ReplaceNav
if x%TargetName:-External-=%==x%TargetName% goto SkipSearch 
if x%TargetName:-Public-=%==x%TargetName% goto SkipSearch
:: do not uncomment or the skin will not get copied to the output

правильно пройти через переменную% TargetName%, чтобы увидеть, имеет ли она значение -Internal, -External или -Public, а затем перейти к правильному блоку кода в моем сценарии? В настоящее время, кажется, оценивать

if x%TargetName:-Internal-=%==x%TargetName%  goto ReplaceNav

оператор, но независимо от того, что он заменяет навигационные страницы в сборках на -External и -Public :( Я должен также упомянуть, что это, если заявление вообще не было написано мной, и если вы можете придумать какой-то другой способ анализа переменная% TargetName% для -Internal, -Public или -External Я все для этого.

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

2 ответа2

2

Вы говорите, что ищете -Internal , но ваш поиск и замена ищет -Internal- . Это верно для всех ваших операций поиска и замены. Я подозреваю, что это может сработать, если вы просто удалите нежелательный трейлинг - из поисков.

if x%TargetName:-Internal=%==x%TargetName%  goto ReplaceNav
if x%TargetName:-External=%==x%TargetName% goto SkipSearch 
if x%TargetName:-Public=%==x%TargetName% goto SkipSearch
:: do not uncomment or the skin will not get copied to the output
0

Поскольку вы говорите, что PowerShell будет приемлемым, я бы рекомендовал пойти по этому пути.

Я не уверен на 100% в том, что вы здесь делаете, но вот пример сценария, который, как я считаю, сделает часть того, что вы просите. Затем вы можете решить, хотите ли вы больше переходить на Powershell.

Проверьте, содержит ли targetName значение "Internal":

If ($TargetName -Contains "Internal")
  {
    FunctionReplaceNav($TargetName)
  }

Так что это немного более прямо вперед и легко читается. Затем снова как набросок, а не окончательный код:

Вы можете выполнить дополнительную обработку для замены в функции (или встроенную, как вы хотели в исходном операторе If), например:

$CopyVariableName = Copy-Item Object.Ext copyToDirectory\Folder
if (!($CopyVariable))
   {
    Write-Host "Something Went wrong copying: $TargetName"
   }
else 
   {
    #Nothing here, moves along
    }

Конечно, мы могли бы также сделать обнаружение ошибок намного более устойчивым, например, используя Try, Catch, Наконец и перехватывая любые системные исключения, такие как Access denied, целевой компьютер недоступен и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .