2011-12-29 17 views
5

tengo el siguiente comando:Formateo de la salida detallada de un comando Remove-Elemento

Get-ChildItem $build_path ` 
    -Include *.bak, *.orig, *.txt, *.chirp.config ` 
    -Recurse | Remove-Item -Verbose 

para borrar algunos archivos de la carpeta de compilación de una solución VS. Uso el modificador Verbose para poder ver qué archivos se están eliminando. Funciona bien, pero la salida es demasiado detallado:

VERBOSE: Performing operation "Remove File" on Target "R:\Visual Studio 2010\Projects\SomeProject\SomeProject.Web.build\App_Readme\glimpse.mvc3.readme.txt". 
VERBOSE: Performing operation "Remove File" on Target "R:\Visual Studio 2010\Projects\SomeProject\SomeProject.Web.build\App_Readme\glimpse.readme.txt". 

sólo hay que ver algo así:

Removing file \App_Readme\glimpse.mvc3.readme.txt". 
Removing file \App_Readme\glimpse.readme.txt". 
... 

Sé que puedo hacer esto con una instrucción foreach y un comando Write-Host, pero creo que se puede hacer con algún tipo de canalización o algo así. ¿Algunas ideas?

Respuesta

6

Usando ForEach-Object es bastante sencillo:

Get-ChildItem $build_path ` 
    -Include *.bak, *.orig, *.txt, *.chirp.config ` 
    -Recurse | foreach{ "Removing file $($_.FullName)"; Remove-Item $_} 

Como @ user978511 señaló, utilizando la salida detallada es más complicado:

$ps = [PowerShell]::Create() 

$null = $ps.AddScript(@' 
    Get-ChildItem $build_path ` 
     -Include *.bak, *.orig, *.txt, *.chirp.config ` 
     -Recurse | Remove-Item -Verbose 
'@) 

$ps.Invoke() 
$ps.Streams.Verbose -replace '(.*)Target "(.*)"(.*)','Removing File $2' 
+0

No sabía que podría usar foreach en una tubería. Gracias. – lalibi

1

Para poder modificar el mensaje que necesita primero para cath la salida que no es tan fácil. Puede consultar la respuesta en esta página: Powershell Invoke-Sqlcmd capture verbose output para captar la salida. A partir de ahí se puede modificar el mensaje y mostrarlo en su formato, pero las opciones foreach parece más fácil para mí

3

En PowerShell 3.0 se puede escribir el flujo detallado de la secuencia de salida (por ejemplo, 4> & 1) y luego vuelva a colocar el mensaje:

Get-ChildItem $build_path ` 
    -Include *.bak, *.orig, *.txt, *.chirp.config ` 
    -Recurse | Remove-Item -Verbose 4>&1 | Foreach-Object{ ` 
     Write-Host ($_.Message -replace'(.*)Target "(.*)"(.*)','Removing File $2') -ForegroundColor Yellow 
} 
1

Esto es unos años demasiado tarde, pero podría ayudar a alguien más que tropieza con esto como yo lo hice así que lo proporcionaré de todos modos.

Me gustaría probar la eliminación del archivo y luego informar sobre el éxito o el fracaso. Vea a continuación:

$FileList = $build_path ` 
    -Include *.bak, *.orig, *.txt, *.chirp.config ` 
    -Recurse 

foreach ($File in $FileList) 
{ 
    Try 
    { 
     Remove-Item $File.FullName -Force -ErrorAction Stop 
     Write-Output "Deleted: $($File.Parent)\$($File.Name)" 
    } 
    Catch 
    { 
     Write-Output "Error deleting: $($File.Parent)\$($File.Name); Error Message: $($_.Exception.Message)" 
    } 
} 

Si quería tanto a la consola de salida y registro en un archivo que puede utilizar Tee-Object al final de cada línea que comienza con Write-Output anteriormente.

| Tee-Object -FilePath $your_log_file -Append 
Cuestiones relacionadas