He encontrado varias soluciones a este problema, pero desafortunadamente ninguna de ellas parece funcionar en mi ventana de Windows.
Estoy ejecutando un FOR
bucle en un archivo por lotes para recorrer varios archivos de texto. Para cada archivo de texto, quiero ECHO
su nombre (y posiblemente redirigir la salida al archivo) si un grep
(de WinGNU) devuelve una línea. Una búsqueda rápida en Google me muestra que lo haga de esta manera:
IF grep -c pattern file ( stuff )
Sin embargo, esto arroja un error
-c was unexpected at this time.
Alternativamente, pensé que podría usar el código de salida de esta grep --quiet
manera:
grep -q pattern file
IF ERRORLEVEL 1 ( stuff )
Esto siempre falla la prueba IF, incluso cuando el grep tiene éxito.
¿Hay una buena manera de ejecutar una declaración condicional en Windows si mi grep encuentra una coincidencia?
Mi código es:
SET locations=( a, long, list, of, last, two, octets )
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%r IN %locations% DO (
grep -i "^\[CardSwipe\]" \\10.0.%%r\path\to\file.ini
IF ERRORLEVEL 1 echo %%r
Mi salida es:
[this line left intentionally blank] :)
fuente
grep
por mí? En particular, ¿qué tipo de cadenas estás tratando de combinar?[CardSwipe]
mayúscula y minúscula literal . Estoy escaneando un conjunto deini
archivos que deberían haber[CardSwipe]
comentado, así que necesito saber si alguno de ellos todavía comienza[CardSwipe]
(en lugar de estar oculto detrás del rem, por ejemplo;[CardSwipe]
Respuestas:
No puedo pensar en una buena manera de hacer esto con Batch, especialmente porque traes herramientas de línea de comandos no nativas con las que no estoy familiarizado. Sin embargo, PowerShell generalmente es mucho más adecuado para tareas como esta.
Esto debería hacer el trabajo por usted en PowerShell:
Aquí está el desglose:
$Hosts
como una matriz que contiene cadenas que representan los dos últimos octetos de cada sistema a verificar. Un método alternativo para configurar esto sería tener un archivo de texto con una entrada por línea.ForEach-Object
cual, como su nombre lo indica, ejecutará comandos para cada objeto en la matriz. Si utiliza un archivo de texto como lista, deberá buscarloGet-Content
y luego canalizarloForEach-Object
en lugar de la variable.if
condición es lo que va a cazar por ti.Get-Content
hace lo que dice en la lata: obtiene el contenido de las cosas."\\10.0.$_\path\to\file.ini"
es el objetivo que estamos dandoGet-Content
. Al envolver la cadena entre comillas dobles, le estamos diciendo a PowerShell que queremos que expanda las variables dentro de la cadena antes de pasar el parámetro.$_
es una variable incorporada que hace referencia al objeto actual en el que trabajan cosas comoForEach-Object
.Get-Content
se canaliza aSelect-String
.Select-String
es más o menos grep para PowerShell; de hecho, estoy un poco sorprendido de que no haya un alias incorporado para este ya que otros cmdlets (lo que llaman comandos de PowerShell) tienen alias a comandos * nix similares como ls y wget ."^\[CardSwipe\]"
- Oh si.Select-String
toma RegEx por cierto.( ... ).length
significa que quiero obtener la longitud de cualquier objeto que salga del script dentro del paréntesis. Para cadenas, esta es la longitud básica de los caracteres. Para las matrices, este es el número de miembros en la matriz. Cuando se recupera un archivo de texto u objeto similar, se devuelve como una "matriz de cadenas". Entonces, el valor de la propiedad de longitud del objeto será igual al número de líneas en el texto.-ne
es el operador de comparación para "no es igual a". SiSelect-String
no encuentra coincidencias, su salida será una matriz nula con longitud cero. Cualquier otra cosa tendrá una longitud de 1 o más, por lo que activamos elif
encendido-ne 0
.Write-Output
es otro de esos comandos autoexplicativos. Escribe salida. En este caso, le estamos diciendo que queremos generar el objeto actual que está procesandoForEach-Object
. Por supuesto, dado que esto está dentro delif
bloque, solo sucederá cuando el archivo ini coincida con las condiciones dadas. La salida será cualquiera de los "últimos dos octetos" que se procesaron cuando eso sucedió.fuente
set current=%%r; set deviceinfo=site: %current:~-5,-4% device: %current:~-1%