Não consigo pensar em uma boa maneira de fazer isso com o Batch, especialmente porque você está trazendo ferramentas de linha de comando não nativas com as quais não estou familiarizado. No entanto, o PowerShell geralmente é muito mais adequado para tarefas como essa.
Isso deve fazer o trabalho para você no PowerShell:
$Hosts = @('1.1','1.2','101.243','54.28')
$Hosts | ForEach-Object {
if ((Get-Content "\10.0.$_\path\to\file.ini" | Select-String "^\[CardSwipe\]").length -ne 0) {
Write-Output $_}}
Aqui está o detalhamento:
- Definimos
$Hosts
como uma matriz contendo strings que representam os dois últimos octetos de cada sistema a ser verificado. Um método alternativo de configuração seria ter um arquivo de texto com uma entrada por linha. - Em seguida, enviamos a matriz para
ForEach-Object
, o que, como o nome indica, executará comandos para cada objeto na matriz. Se você usar um arquivo de texto como sua lista, precisará buscá-lo comGet-Content
e enviá-lo paraForEach-Object
no lugar da variável. - O script na condição
if
é o que você vai fazer para você. -
Get-Content
faz o que diz na lata - obtém o conteúdo das coisas. -
"\10.0.$_\path\to\file.ini"
é o alvo que estamos dando aGet-Content
. Envolvendo a string entre aspas duplas, estamos dizendo ao PowerShell que queremos que ele expanda variáveis dentro da string antes de passar o parâmetro.$_
é uma variável interna que faz referência ao objeto atual sendo trabalhado por coisas comoForEach-Object
. - A saída de
Get-Content
é canalizada paraSelect-String
.Select-String
é mais ou menos grep para o PowerShell - na verdade, estou um pouco surpreso por não haver um alias interno para este, pois outros cmdlets (que chamam de comandos do PowerShell) têm aliases para comandos * nix semelhantes, como ls e wget. -
"^\[CardSwipe\]"
- Ah sim.Select-String
leva o RegEx pelo caminho. - A quebra de comandos entre parênteses permite que você recupere diretamente as propriedades dos objetos que elas geram, sem precisar primeiro descarregá-las para variáveis ou qualquer outra coisa. Então,
( ... ).length
significa que eu quero que o comprimento de qualquer objeto seja gerado pelo script dentro dos parênteses. Para strings, esse é o tamanho básico do caractere. Para matrizes, esse é o número de membros na matriz. Quando um arquivo de texto ou objeto semelhante é recuperado, ele é retornado como "array de strings". Assim, o valor da propriedade length do objeto será igual ao número de linhas no texto. -
-ne
é o operador de comparação para "diferente de". SeSelect-String
não encontrar nenhuma correspondência, sua saída será uma matriz nula com comprimento zero. Qualquer outra coisa terá comprimento 1 ou mais, então acionamos oif
on-ne 0
. -
Write-Output
é outro desses comandos autoexplicativos. Escreve saída. Nesse caso, estamos informando que queremos exibir o objeto atual sendo processado porForEach-Object
. Naturalmente, como isso está dentro do blocoif
, isso só acontecerá quando o arquivo ini corresponder às condições dadas. A saída será qualquer um dos "dois últimos octetos" sendo processados quando isso aconteceu.