Jump to content

Recommended Posts

Posted

Hey.

Estava a tentar criar um batch para correr o setup de um programa consoante a arquitectura é 32 ou 64 bits, mas não estou a conseguir. Trata-se do Office, e tenho um Setup.exe dentro de cada uma das pastas x86 e x64. Essas pastas estão na mesma directoria que o Batch.

Isto é o que tenho:

if %processor_architecture%==AMD64
.\x64\Setup.exe
else
.\x86\Setup.exe

E obtenho da linha de comandos:

The syntax of the command is incorrect.

if AMD64==AMD64 (aparece como um comando corrido à parte?)

Alguém me consegue dar uma ajuda? Obrigado.

Posted (edited)

Obrigado pela resposta rápida.

O problema era mesmo o THEN, parece. No entanto, ao correr o script, tanto o IF como o ELSE são executados, o que não faz sentido nenhum.

Uma possível explicação é esta mensagem de erro que surgiu pelo meio: " 'ELSE' is not recognized as an internal or external command, operable program or batch file."

No entanto, essa mensagem só surge se retirar os parênteses, o que me parece ser algo estranho para desencadear o comportamento, uma vez que só tem uma instrução, logo não haveria problema.

Mas com ou sem parênteses, o script entra na mesma nas duas opções. Ideias? :S

Edited by Alegom
Posted

Pelo que li, os parêntesis são necessários, e é a forma do ELSE ser considerado a continuação do IF. Parece que a sintaxe dos batches files é bastante sensível a alguns detalhes.

Eu executei a script que indiquei numa VM (Win XP), e funcionou devidamente. Qual é a script que estás a usar agora?

Posted (edited)

Isto está a ficar mais estranho a cada minuto. O que estou a usar neste momento é:

if PROCESSOR_ARCHITECTURE==AMD64 or PROCESSOR_ARCHITEW6432==AMD64 (
.\x64\Setup.exe
)
else (
.\x86\Setup.exe
)

Neste momento, ter os parênteses não afecta, envia a mensagem de erro na mesma. O THEN também parace que deixou de influenciar.

Mas o que me está a deixar preocupado é que tanto o IF como o ELSE estão a ser corridos. Mesmo alterando o ELSE para um IF com a condição contrária, mal o primeiro .exe é fechado, o outro é aberto.

Engraçado também é que pedi a um amigo para testar e funcionou bem. Por isso, que raio se passa neste computador? xD

Edited by Alegom
Posted

Eu alertei-te para o facto da sintaxe do batch ser sensível a pequenos detalhes, pelo que devias tentar manter o máximo da script que te indiquei. No teste que fiz, também tive problemas estranhos, que podem ser derivados da versão do SO usada.

Pega no código que te indiquei, substitui apenas os echos, e vê se funciona. Em particular, coloca o ELSE na mesma linha que o ).

Já agora, como é que negaste a condição?

Posted (edited)

Ok. Seguindo a tua sugestão, de facto o erro do ELSE na linha de comandos desaparece, mas os dois Setup's continuam a ser executados sequencialmente. Mal fecho o primeiro, a linha de comandos mostra o comando no interior ELSE (como tinha feito para o do IF) e executa o outro.

O que eu tinha experimentado em termos de negar a condição não foi ao nível da linguagem (não quis arriscar), foi pela lógica do link que enviaste. Ou seja, se é x86, então PROCESSOR_ARCHITECTURE=x86. Assim excluiria a questão do ELSE definitivamente. Mas continuou a entrar em ambas as condições.

Update: Estive a explorar uma ideia, e parece que é possível estar relacionado. Esperimentei o script no PC de uma pessoa com W8.1 (como eu) e também deu o mesmo problema. Já a outra pessoa que tinha referido anteriormente, tem W7. Ao mudar de 7 para 8 a MS mudou o funcionamento da linguagem?!

Edited by Alegom
Posted (edited)

Não tem problema. Só tenho que agradecer por toda a ajuda que me prestaste, já aprendi muito que não sabia antes.

No entanto, decidi experimentar colocar a dúvida em mais um local e acho que consegui resolver. Por isso aqui fica a solução, para alguém que também esteja interessado.

@echo off

if %PROCESSOR_ARCHITECTURE%==AMD64 goto :x64
if %PROCESSOR_ARCHITEW6432%==AMD64 goto :x64

:x86
   start .\x86\Setup.exe
   exit

:x64
   start .\x64\Setup.exe
   exit

A ideia é que os IF's não funcionam da forma que outras linguagens nos habituam. É preciso utilizar o comando GOTO e depois direccionar a execução do código, através do comando EXIT, de modo a evitar correr segmentos não desejados.

Mais uma vez obrigado, Rui. Espero que este post também te ajude de alguma forma, quanto mais não seja o satisfazer da curiosidade. Fica bem.

EDIT: Afinal o OR não estava a funcionar, na medida em que a lógica em Batch é feita de forma diferente. Por isso actualizei o código para corrigir a situação, de uma forma simplificada. O START faz com que o programa execute sem que a linha de comandos esteja aberta simultaneamente, sendo fechada depois de o iniciar.

Edited by Alegom
  • Vote 1

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.