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
$Hostscomo 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-Contente enviá-lo paraForEach-Objectno lugar da variável. - O script na condição
ifé o que você vai fazer para você. -
Get-Contentfaz 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-Stringleva 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,
( ... ).lengthsignifica 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-Stringnã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 oifon-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.