IF instruções em arquivos em lote

0

Atualmente, estou usando o Cruise Control para agendar 'builds' para vários sites internos. Eu uso arquivos em lote para iniciar cada uma dessas 'compilações' (compilação que significa uma saída específica para webhelp). Digamos que, por exemplo, temos compilações internas, externas e públicas. Dentro do arquivo mestre de lote, você encontrará o seguinte código:

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

Então, deixe-me explicar o que está acontecendo aqui. A variável% TargetName% já está definida para um valor antes que essa parte do script seja executada. A variável% TargetName% conterá o texto -Internal, -External ou -Public e terá outros caracteres no início ou no final de cada nome de destino, mas a coisa pela qual eu quero ter uma declaração condicional é se o script Veja -Internal na variável% TargetName%, o script irá pular para um bloco de código rotulado: ReplaceNav. Aqui está o que: ReplaceNav parece.

: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

O ReplaceNav essencialmente substitui dois arquivos na saída da webhelp por duas páginas personalizadas que contêm um mecanismo de pesquisa disponível apenas para usuários internos.

Se a variável% TargetName% contiver -External ou -Public, o arquivo em lote DEVE pular para a seção: SkipSearch do arquivo em lotes.

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

O meu problema é o seguinte (e tenho a certeza que tem a ver com a não estruturação adequada da instrução IF): Como estruturo este bloco de código

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

para percorrer corretamente a variável% TargetName% para ver se ela tem o valor de -Internal, -External ou -Public e, em seguida, pule para o bloco de código correto no meu script? Atualmente, parece avaliar o

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

declaração, mas não importa o que está substituindo as páginas de navegação em compilações com -Externo e -Público também :( Eu também deve mencionar que esta declaração if não foi escrita por mim em tudo e se você pode pensar em algum outro maneira de analisar a variável% TargetName% para -Internal, -Public ou -External eu sou tudo para ele.

Eu entendo isso como uma pergunta estranha, então, por favor, deixe-me saber se você precisa de mais detalhes para poder responder.

    
por Richie086 03.06.2013 / 17:37

2 respostas

2

Você diz que está procurando -Internal , mas sua pesquisa e substituição está procurando por -Internal- . Isso é verdade para todas as suas operações de pesquisa e substituição. Eu suspeito que pode funcionar se você simplesmente remover o - não desejado das buscas.

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
    
por 03.06.2013 / 19:12
0

Como você diz que o PowerShell seria aceitável, eu incentivaria esse caminho.

Eu não tenho 100% de certeza do que você está fazendo aqui, mas aqui está um script de exemplo que acredito que faria parte do que você está pedindo. Você pode então decidir se gostaria de migrar mais para o Powershell.

Verifique se o targetName contém "Internal":

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

Então, isso é um pouco mais direto e fácil de ler. Então, novamente, mais como um esboço, então o código final:

Você pode fazer processamento adicional na substituição em uma função (ou inline desejado na declaração If original) como:

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

É claro que também podemos tornar o erro muito mais robusto, por exemplo, usando Try, Catch, Finally e capturando quaisquer execuções do sistema, como Access denied, meta de máquina inacessível, etc.

    
por 03.06.2013 / 19:20