Форматирование подробного вывода команды Remove-Item - PullRequest
5 голосов
/ 29 декабря 2011

У меня есть следующая команда:

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

для удаления некоторых файлов из папки сборки решения VS. Я использую переключатель Verbose, чтобы видеть, какие файлы удаляются. Работает нормально, но вывод слишком подробный:

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".

Мне просто нужно увидеть что-то подобное:

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

Я знаю, что могу сделать это с помощью оператора foreach и команды Write-Host, но я верю, что это можно сделать с помощью какой-то конвейерной обработки или чего-то еще. Есть идеи?

Ответы [ 4 ]

6 голосов
/ 29 декабря 2011

Использование ForEach-Object довольно просто:

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

Как указывал @ user978511, использование подробного вывода более сложно:

$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'
3 голосов
/ 29 декабря 2011

В PowerShell 3.0 вы можете записать подробный поток в выходной поток (например, 4> & 1) и затем заменить сообщение:

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 голос
/ 19 июля 2017

Это на несколько лет позже, но это может помочь кому-то, кто наткнется на это, как я, поэтому я все равно предоставлю.

Я бы попытался удалить файл, а затем сообщить об успехе или неудаче. Смотрите ниже:

$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)"
    }
}

Если вы хотите вывести на консоль и войти в файл, вы можете использовать Tee-Object в конце каждой строки, начиная с Write-Output выше.

| Tee-Object -FilePath $your_log_file -Append
1 голос
/ 29 декабря 2011

Чтобы иметь возможность изменить сообщение, вам нужно сначала обработать вывод, который не так прост.Вы можете обратиться к ответу на этой странице: Powershell Invoke-Sqlcmd перехватывает подробный вывод , чтобы перехватить вывод.С этого момента вы можете изменить сообщение и показать его в своем формате, но варианты foreach кажутся мне проще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...