Script em lote - Eco parêntese da palavra “Onde”

5

Algum tempo atrás, perguntei sobre Sintaxe de redirecionamento de script em lote e recebi uma resposta legal. Eu usei o método () parêntese com mais freqüência para echo em scripts em lote e redirecionar para arquivos, etc.

Eu me deparei com um problema estranho em que parece que a palavra Where não pode ser echo d como essa palavra literalmente e parece que é interpretada como a Where sendo chamado em seu lugar.

Para simplificar este exemplo, simplifiquei a lógica do script para uma versão muito mais simples, mas a lógica PowerShell sendo echo 'd poderia ser muito mais complexa do que isso .

Exemplo de script

@ECHO ON

(
    ECHO [System.IO.DriveInfo]::GetDrives() ^| Where {$_.Name -like "C:\"}
)>> Outfile.txt

PAUSE

Erro

INFO: Could not find files for the given pattern(s).

enter image description here

O que eu fiz

Eu tentei isso um pouco e fiz uma pesquisa rápida e não consegui encontrar uma resposta simples. Como não fiz muitas perguntas sobre o SuperUser , imaginei que esse seria um bom potencial.

Uma coisa em particular que tentei era definir uma variável como um valor de string Where (ou seja, SET w=Where ) e, em seguida, nos comandos echo entre parênteses que referenciei essa variável (ou seja, %w% ) no lugar do palavra Where , mas o resultado ainda é o mesmo erro.

Eu também joguei um pouco com SETLOCAL ENABLEDELAYEDEXPANSION , mas não fez diferença.

@ECHO ON
SET w=Where
(
    ECHO [System.IO.DriveInfo]::GetDrives() ^| %w% {$_.Name -like "C:\"}
)>> Outfile.txt
PAUSE

A solução alternativa

Eu simplesmente não usei o método entre parênteses para echo da palavra " Where " e acabei de utilizar o redirecionamento >> anexado ao método de arquivo em cada linha echo 'd individualmente onde " where " está envolvido. Não é grande coisa para este pequeno exemplo, mas um grande negócio para um script maior.

@ECHO ON
ECHO [System.IO.DriveInfo]::GetDrives() ^| Where {$_.Name -like "C:\"}>> Outfile.txt
PAUSE

Questões correlatas

Hmmmmm ......

  1. O que está causando isso e o que exatamente está acontecendo quando isso ocorre?

  2. Existe uma maneira de permitir que a palavra (ou string) " Where " seja usada sem o problema?

Recursos

por Pimp Juice IT 23.10.2017 / 14:39

3 respostas

4

Você diagnosticou incorretamente o problema - ONDE não tem nada a ver com isso.

Você simplesmente precisa escapar do parêntese de fechamento:

@ECHO ON

(
    ECHO [System.IO.DriveInfo]::GetDrives(^) ^| Where {$_.Name -like "C:\"}
)>> Outfile.txt

PAUSE
    
por 23.10.2017 / 15:00
3

Aqui está uma outra opção para você. Isso não requer que você escape dos parênteses ou do pipe. Quando você redireciona o dispositivo NUL para o comando SET /P , ele grava a string de prompt para stdout. A única ressalva para isso é que SET /P não escreve um retorno de carro e um feed de linha, então você precisa de um ECHO. vazio para produzir o CRLF.

@ECHO OFF

(
<nul set /p "=[System.IO.DriveInfo]::GetDrives() | Where {$_.Name -like "C:\"}" &echo.
echo another line
)>Outfile.txt

notepad Outfile.txt
PAUSE
    
por 25.10.2017 / 22:57
2

Por que vale a pena parece que, depois de um ) , o CMD interpreta ^| como | :

C:\> (echo 1.The && echo 2.quick && echo 3.brown && echo 4.fox) ^| find "q"
2.quick
    
por 26.10.2017 / 05:06

Tags