Tubulação de linha de comando do Win7

0

Eu quero saber por que, na linha de comando, isso acontece.

Eu tenho um script fileX.cmd , que é uma única linha de texto:

@echo dir

Se eu fizer

C:\Users\Dogfood>fileX.cmd | cmd

Isso mostrará todos os arquivos no diretório, mas ...

C:\Users\Dogfood>type fileX.cmd | cmd

não. O prompt de comando abre um novo cmd, mas me pergunta " More? "

Por que o conteúdo do fileX.cmd não é canalizado para o cmd à direita do pipe? da mesma forma que a primeira linha? (por exemplo, fileX.cmd | cmd )

    
por Dogfood 14.09.2014 / 16:54

2 respostas

0

O pipe para cmd | cmd executará todos os comandos em seu fluxo de entrada.

  • No primeiro caso, o fluxo de entrada conterá a saída de fileX.cmd , ou seja, dir , e é isso que o | cmd executará.
  • no segundo caso, o fluxo de entrada conterá @echo dir , portanto você deverá ver apenas o texto dir .

Eu recebo More? se não houver uma nova linha no final do comando em fileX.cmd . A razão para a diferença é que o shell principal assumirá o comando como concluído quando o EOF for alcançado, enquanto o cmd no final do pipe espera linhas completas. Se você quiser uma explicação de por que isso deveria acontecer, você terá que perguntar à Microsoft.

(A propósito, sua descrição se refere a fileX , não fileX.cmd , e você diz que contém uma única linha, enquanto eu suspeito que ela contém uma linha incompleta.)

    
por 14.09.2014 / 17:55
-1

Você precisa lembrar que a tubulação leva a saída da primeira parte do comando e passa para o próximo comando.

Vamos pegar fileX.cmd | cmd e dividi-lo:

filex.cmd = @echo dir

Se digitarmos @echo dir na linha de comando, veremos a saída como dir . O eco simplesmente gera o que vem depois do comando echo. A saída não é executada, apenas exibida.

digitando filex.cmd no prompt de comando e pressionando enter nos dá a saída dir . Isso não é diferente da declaração anterior, apenas que o comando está em um arquivo batch / cmd.

Se adicionarmos o | cmd , os resultados que vemos são diferentes, obtemos uma listagem de diretórios. Por quê? Como a saída de filex.cmd é dir e estamos passando dir para o prompt de comando, que pega essa saída e a executa, fornecendo uma listagem de diretórios.

Então por que o segundo comando não faz a mesma coisa? O motivo é que você está usando o comando type . Type exibe o texto na tela. Se sua listagem de diretórios é curta, teria funcionado. No entanto, sua listagem de diretório rola para fora da tela, portanto, o comando type pausará a saída e perguntará se você deseja more? . Essa questão, more? agora é a saída e sendo passada para o prompt de comando.

Note que, se a lista de diretórios fosse mais curta, type não pediria mais e o comando funcionaria como você esperaria. Tente os mesmos comandos em um diretório que contém apenas alguns diretórios e arquivos e você verá a diferença.

    
por 14.09.2014 / 17:58