É possível “declarar” um arquivo cmd do Windows (arquivo em lote) como 32 bits?

7

Antecedentes:

Fazemos alguns scripts e pequenos ajudantes com arquivos em lote ( xyz.cmd ) no trabalho. O Windows 7 só agora está começando a se espalhar por aqui e, obviamente, atingimos os problemas associados às diferentes variáveis de ambiente das janelas de 32 bits vs. 64 bits.

Especificamente, se você executar C:\Windows\system32\cmd.exe em um Windows de 64 bits, você verá:

...
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
...

considerando que, se você iniciar C:\Windows\SysWOW64\cmd.exe em um Windows de 64 bits, você verá:

...
ProgramFiles=C:\Program Files (x86)         <-- NOTE
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
...

Acontece também que, porque este cmd.exe é um processo de 32 bits, ele também obtém todos os outros redirecionamentos SysWOW64 "de graça" - qualquer invocação de regedit irá para o registro de 32 bits, etc.

Isso pode ser extremamente útil se o arquivo de lote tiver que executar algumas tarefas relacionadas a um aplicativo de 32 bits, por exemplo, caminho + material do registro.

Pergunta:

Sabia que eu tenho uma classe de arquivos em lote que eu gostaria de sempre executar com a versão de 32 bits de cmd.exe , existe um - fácil! - maneira de forçar esses arquivos em lote a sempre usar o cmd.exe de 32 bits nas versões de 64 bits do Windows e executar normalmente em versões de 32 bits do Windows?

Obviamente eu posso adicionar um "cabeçalho" a cada um desses arquivos em lote para alterar variáveis de ambiente e invocações de regedit e / ou obviamente eu poderia apenas dizer aos usuários para "executar este arquivo em lote através do cmd.exe SysWOW64 ", mas nenhuma dessas soluções parece muito atraente: -)

    
por Martin 28.11.2011 / 15:29

3 respostas

10

Eu tenho três soluções possíveis para o seu problema:

1) Use um arquivo de lote de wrapper

Em uma empresa em que eu trabalhava, tínhamos um único arquivo em lote para tudo o que é executado. Fizemos isso para simplificar a interação com nossos usuários, mas funcionaria de maneira semelhante. Se você quiser, poderá criar um wrapper para cada arquivo em lote (basicamente, criar dois arquivos em lotes) ou criar um único wrapper que permita selecionar cada arquivo em lote de um menu (conforme descrito link ). Você pode fazer com que cada seleção de menu identifique o caminho para o arquivo de lote a ser executado e, em seguida, você pode fazer com que o wrapper escolha o cmd.exe correto para iniciá-lo.

2) Use o arquivo em lote como um empacotador automático

Para cada arquivo em lote, você pode incluir um cabeçalho que determina em qual SO você está (32 ou 64 bits). Se você estiver em um sistema operacional de 64 bits, saberá que, por padrão, está sendo iniciado usando a versão de 64 bits do cmd.exe. Você poderia ter esse arquivo, em seguida, iniciar a versão de 32 bits do cmd.exe com o mesmo arquivo em lotes, mas você também pode passar o arquivo em lote um sinalizador que diz para ignorar a verificação de 64 bits. Em seguida, ele seria executado sob o cmd.exe de 32 bits correto.

Por exemplo:

@ECHO Off

::Check if 64-bit check skip flag exists

IF %1 == /skipcheck (goto run)

::Check if OS is 64-bit

IF %processor_architecture%==AMD64 (<path_to_32-bit_cmd> /c "<path_to_batch_file>\<name_of_my_batch_file>" /skipcheck)
IF %processor_architecture%==AMD64 (goto end)

:run

echo Hello World!

:end

Eu não testei o código acima, então eu posso ter algumas citações ou parênteses no lugar errado, mas esta é a idéia geral.

3) Migrar para o PowerShell

O PowerShell está disponível para todos os sistemas operacionais Windows XP e mais recentes. O PowerShell é projetado pela Microsoft para, eventualmente, substituir o cmd.exe simples e fornece uma linguagem rica para executar praticamente qualquer tarefa. A maioria dos programas em lote é realmente executável no PowerShell e, no máximo, pode exigir ajustes mínimos.

    
por 23.01.2012 / 23:15
4

Você deve executar explicitamente a versão cmd.exe desejada e fazer com que ela execute o arquivo em lotes:

Para executar em 64 bits: C:\Windows\system32\cmd.exe /C path\to\batchfile.cmd
Para executar em 32 bits: C:\Windows\SysWOW64\cmd.exe /C path\to\batchfile.cmd

O parâmetro / C executa o comando fornecido e termina . (Sim, isso é um link para a documentação do XP).

    
por 24.01.2012 / 01:25
-3
Os arquivos

.com criados em uma máquina de 32 bits são executados somente em máquinas de 32 bits. Se você compilá-lo como um arquivo exe, renomeie sua extensão para .com, então apenas máquinas de 32 bits poderão executá-lo.

Não é muito propício se você está constantemente editando o script, mas acho que é o melhor método, já que ele esconde seu código também.

    
por 12.10.2014 / 19:00