Usando a chamada SET para designar uma variável em um batch do DOS

0

Tentando usar o Call SET para definir uma variável em um loop de arquivo de lote do Windows. Não está funcionando, mas aqui está o arquivo de entrada / saída. tentando atribuir Var C para igual a 1.

Arquivo em lote:

 @ECHO OFF
for /f "tokens=1-3 delims=," %%a in (Puck.csv) do (

echo Hello No Hockey>%%a.txt

echo #:A %%a>>%%a.txt

echo #:B %%b>>%%a.txt

if /I %%c gtr 10 call set %%c==1

echo #:C %%c>>%%a.txt

)

Puck.csv

1991,NHL Strike,20

1992,NHL Strike,20

1993,NHL Strike,20

OutPut:

Hello No Hockey
#:A 1991
#:B NHL Strike
#:C 20
Hello No Hockey
#:A 1992
#:B NHL Strike
#:C 20
Hello No Hockey
#:A 1993
#:B NHL Strike
#:C 20
por Ray G 05.01.2013 / 09:56

2 respostas

2

Você tem 2 problemas:

1) Você está confuso para variáveis com variáveis de ambiente. Um lote para o nome da variável é sempre um único caractere e é acessado por meio de 2 porcentagens antes do nome: %%c . Um valor de variável FOR não pode ser alterado com SET.

Um nome de variável de ambiente pode conter vários caracteres, embora possa ser um único caractere, e é acessado ao incluir o nome em porcentagens: %var% . Os pontos de exclamação podem ser usados se você quiser uma expansão atrasada: !var! . Um valor de variável de ambiente é definido com SET.

2) O truque CALL para acessar valores de variáveis de ambiente que foram definidos dentro de um bloco de código entre parênteses é usado no momento da expansão, não quando você está configurando o valor.

Acredito que o mousio forneceu a melhor resposta; Eu sempre uso a expansão atrasada como nessa resposta. Mas é possível fazer o que você quiser sem uma expansão atrasada usando apropriadamente uma variável de ambiente e o truque CALL.

@echo off
for /f "tokens=1-3 delims=," %%a in (Puck.csv) do (
  echo Hello No Hockey>%%a.txt
  echo #:A %%a>>%%a.txt
  echo #:B %%b>>%%a.txt
  set C=%%c
  if /i %%c gtr 10 set C=1
  call echo #:C %%C%%>>%%a.txt
)

Note que é crítico que o caso da variável FOR seja diferente da variável de ambiente. As variáveis FOR diferenciam maiúsculas de minúsculas, as variáveis de ambiente não são. Se você usar c para ambos, o analisador tratará %%c%% como a variável FOR seguido por um percentual - não o que você deseja.

    
por 06.01.2013 / 19:20
1
 @ECHO OFF
setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=," %%a in (Puck.csv) do (
echo Hello No Hockey>%%a.txt
echo #:A %%a>>%%a.txt
echo #:B %%b>>%%a.txt
set c=%%c
if /I !c! gtr 10 set c=1
echo #:C !c!>>%%a.txt
)

Apenas pesquisa enabledelayedexpansion e saiba quando e como usá-lo (com ! em vez de % ).
Além disso, não há necessidade de usar call ao redefinir c (usando um único = ).

    
por 05.01.2013 / 12:24