O que significa “(” significa em cmd

4

Sempre que eu digitar um ( , ou seja, um parêntese de abertura no Prompt de comando , , isso acontece:

(
More? 

Se eu continuar digitando ( ou qualquer outro caractere , será exibida a mesma mensagem. Isso é interrompido , se eu inserir ) , ou seja, o parêntese de fechamento , embora eu receba um erro, que diz:

) was unexpected at this time

Além disso, eu não encontrei o que este comando faz . Alguma idéia do que ela faz?

    
por Frank Underwood 21.03.2017 / 09:46

3 respostas

6

() não é realmente um comando, mas um operador de agrupamento que permite agrupar uma seqüência de comandos para usá-lo no lugar onde o shell CMD normalmente espera que um único comando apareça. Os comandos entre o () são realmente executados em uma instância separada do CMD. Quando você digita "(" manualmente, insere essa nova instância e aguarda seus comandos.

if not exist c:\myfile (
  echo File doesn't exist
) else (
  echo File DOES exists
  del c:\myfile
)

Observe que normalmente IF ELSE deve estar na mesma linha e você só pode executar um único comando na cláusula THEN e ELSE.
Usar o "()" trata o bloco inteiro (xxxxx) como um único comando e até como se ele aparecesse na mesma linha.

    
por 21.03.2017 / 10:17
3

Muita informação boa já foi postada aqui - por exemplo, parênteses são “um operador de agrupamento que permite agrupar uma sequência de comandos juntos para usá-lo no lugar onde o shell CMD normalmente espera um único comando para aparecer ” que “ são como um bloco inicial e bloco final ” - mas algumas coisas simples foram negligenciadas:

1. Como não obter o erro “inesperado neste momento”

Você pode conseguir algo útil para acontecer simplesmente digitando command (s) no prompt More?  :

C:\> (
More? date /t
More? )
Tue 04/11/2017

C:\> (
More? dir \Windows\win.ini
More? )
 Volume in drive C is OS
 Volume Serial Number is ▒▒▒▒-▒▒▒▒

 Directory of C:\Windows

08/13/2014  12:26 PM               435 win.ini
               1 File(s)            435 bytes
               0 Dir(s)  ▒▒▒,▒▒▒,▒▒▒,▒▒▒ bytes free

C:\>

Você pode digitar vários comandos em linhas separadas e pode mover o ) até o final da última linha:

C:\> (
More? date /t
More? time /t
More? )
Tue 04/11/2017
06:18 PM

C:\> (
More? date /t
More? time /t)
Tue 04/11/2017
06:18 PM

C:\>

2. Como ( e ) afetam o significado de um comando?

Como outros apontaram, existem comandos como

C:\> for %f in (\Windows\*.dll) do @echo %f

em que () fazem parte da sintaxe do próprio comando ( FOR , neste caso). Se você remover os parênteses, você receberá um erro de sintaxe. Eu não estou falando sobre isso.

Como declarado ad nauseam , parênteses grupo comandos. Considere esta linha de comando:

echo cat & echo dog | findstr /n a

Isso significa

  1. Do echo cat , e então
  2. Do echo dog | findstr /n a
    Como a palavra “cão” não contém a letra “a”, este comando não produzirá saída.

Assim, a saída para o acima é

C:\> echo cat & echo dog | findstr /n a
cat

Da mesma forma,

C:\> echo cat & echo dog | findstr /n o
cat
1:dog

em que obtemos a saída 1:dog adicional, porque "cachorro" faz contém "o", e "dog" é a primeira linha de entrada ( 1 st) para o comando findstr .

Agora considere

(echo cat & echo dog) | findstr /n a

(igual ao acima, mas com parênteses adicionados), o que significa

  1. Do echo cat ,
    e depois,
    do echo dog e
  2. Pegue a saída acima e canalize-a para findstr /n a

Então,

C:\> (echo cat & echo dog) | findstr /n a
1:cat

C:\> (echo cat & echo dog) | findstr /n o
2:dog

porque a saída do lado esquerdo (# 1) da linha de comando é

cat
dog

e "a" é encontrado na linha 1 desse texto, e “o” é encontrado na linha 2 . Nós não temos mais uma linha de saída que diz apenas cat (sem um número de linha) porque o echo cat não é mais um comando independente mas faz parte do grupo que compõe o lado esquerdo do pipeline.

Veja um exemplo mais simples de agrupamento de comandos:

C:\Temp> echo cat & echo dog > animals
cat

C:\Temp> type animals
dog

C:\Temp> (echo cat & echo dog) > animals

C:\Temp> type animals
cat
dog

E, claro, como mostrado acima e nas outras respostas, você pode adicionar quebras de linha dentro do grupo:

C:\> (
More? echo cat
More? echo dog
More? ) | findstr /n a
1:cat

3. Os parênteses criam uma nova instância do CMD?

Eu não penso assim; não de maneira óbvia e significativa:

C:\> (cd windows)

C:\Windows> set a=aardvark

C:\Windows> (set a=bat)

C:\Windows> echo %a%
bat

Observe que o cd entre parênteses altera o diretório de trabalho do processo principal do CMD, e o set entre parênteses substitui o valor da variável que foi definido fora dos parênteses.

    
por 11.04.2017 / 20:18
1

Os (e) são como begin block e end block . Tudo o que você pode colocar em um arquivo de lote (.bat) pode ser digitado na linha de comando.

Por exemplo, eu posso escrever um arquivo de lote com pode colocar um bloco de instruções em um if :

if "%1"=="" (
  echo Multiple
  echo Lines when no parameter
)
echo END

Agora, quando executo o lote sem parâmetros, obtenho todos os comandos entre ( e ) para serem executados. Quando um primeiro parâmetro é fornecido, a única saída é 'END'.

Agora, voltemos à linha de comando: não conheço truques ou técnicas para usar isso digitando diretamente na linha de comando. Mas, no entanto, segue as mesmas regras. Na linha de comando, se você digitar o seguinte:

(echo "1" & echo "2")

A saída é:

1
2
    
por 21.03.2017 / 10:17