2010-08-06 12 views
22

Busqué en todas partes para esto pero no tuve suerte. Quería escribir un pequeño script que buscara un nombre de archivo exacto, no solo una cadena dentro de un nombre de archivo. Por ejemplo, si busco 'hosts' usando Explorer, obtengo múltiples resultados por defecto. Con el script, SOLO deseo el nombre que especifique. Supongo que es posible?secuencia de comandos Powershell para localizar el archivo/nombre de archivo específico?

Realmente solo había comenzado el script y es solo para mi uso personal así que no es importante, me está molestando. Tengo varias unidades, así que comencé con 2 entradas, una para consultar la letra de la unidad y otra para especificar el nombre del archivo. Puedo buscar por extensión, tamaño de archivo, etc. pero no puedo identificar la búsqueda con un nombre exacto.

¡Cualquier ayuda sería apreciada!

EDITAR: Gracias a todas las respuestas. Solo para actualizar. Agregué una de las respuestas a mi pequeño script y funciona bien. Las tres respuestas funcionaron pero solo pude usar una al final, sin ofender a las otras dos. Aclamaciones. Solo para aclarar, 'npp' es un alias para Notepad ++ para abrir el archivo una vez encontrado.

$drv = read-host "Choose drive" 
$fname = read-host "File name" 
$req = dir -Path $drv -r | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq $fname } 
set-location $req.directory 
npp $req 

Respuesta

39

Desde un símbolo del sistema en la raíz:

gci -recurse -filter "hosts" 

sólo va a devolver una coincidencia exacta con nombre de archivo "hosts" - y un montón de mensajes rojos donde necesito permisos elevados (-:

Básicamente, el filtro i s, creo, la clave.


Addednum como SteveMustafa señala ahora se puede utilizar el interruptor -File para dar la siguiente manera recursiva para buscar archivos con el nombre "hosts":

gci -recurse -filter "hosts" -File 

Y si se quiere evitar el "Acceso errores a la trayectoria se niega" a continuación

gci -recurse -filter "hosts" -file -ErrorAction SilentlyContinue 
+3

Ah sí, '-Filter' es más rápido para esto. Dijo que estaba buscando archivos, así que necesitarás agregar '? {! $ PsIsContainer} '. –

+0

Gracias, exactamente lo que estaba buscando :) – gavin19

+1

¿por qué no agregar el modificador de archivos? – SteveMustafa

10

Asumiendo que tiene una unidad Z: asignada:

Get-ChildItem -Path "Z:" -Recurse | Where-Object { !$PsIsContainer -and [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -eq "hosts" } 
+0

Gracias. Respuesta elaborada, funcionó a la perfección.Aprendí algunas cosas también :) – gavin19

7

que utilizan este formulario sólo para este tipo de cosas:

gci . hosts -r | ? {!$_.PSIsContainer} 

. asigna al parámetro posicional Path y "hosts" asigna el parámetro posicional Filter. Recomiendo utilizar Filter sobre Include si el proveedor admite el filtrado (y el proveedor del sistema de archivos sí). Es un poco más rápido que Include.

+0

Saludos, funciona muy bien. Muy apreciado señor! – gavin19

2

búsqueda en la computadora toda
gdr -PSProvider 'FileSystem' | %{ ls -r $_.root} 2>$null | where { $_.name -eq "httpd.exe" }

3

estoy usando esta función en base a la respuesta @Murph. Busca dentro del directorio actual y enumera la ruta completa.

function findit { $filename = $args[0]; gci -recurse -filter "*${filename}*" -file -ErrorAction SilentlyContinue | foreach-object { $place_path = $_.directory echo "${place_path}\${_}" } }

Ejemplo de uso: findit myfile

Cuestiones relacionadas