2016-02-22 3 views
-1

Я застрял в, вероятно, тупой проблеме :( В принципе у меня есть функция, которая пишет какой-то вывод, и я бы подождал, прежде чем выйти из скрипта с помощью команды Read-Host после выхода . функцииPowershell Read-host после Write-host

Здесь вы код:.

Function Get-FileMetaData { 

<# modified script from: 
NAME: Get-FileMetaData 
AUTHOR: ed wilson, msft 
LASTEDIT: 01/24/2014 14:08:24 
Http://www.ScriptingGuys.com 
Requires -Version 2.0 
#> 

Param($folders) 
$tagList = @() 
$tagListUnique = @() 

foreach($folder in $folders) { 
    $i = 18  # attribute for Tags 
    $objShell = New-Object -ComObject Shell.Application 
    $objFolder = $objShell.namespace($folder.FullName) 

    foreach ($file in $objFolder.items()) { 
     if($objFolder.getDetailsOf($File, $i)) { 
      $objEntry = New-Object System.Object 
      $objEntry | Add-Member -type NoteProperty -name File -value $file.Path 
      $objEntry | Add-Member -type NoteProperty -name Tags -value $objFolder.getDetailsOf($File, $i) 
      $tagList += $objEntry 
      $tagListUnique += ($objFolder.getDetailsOf($File, $i) -split ";").trim() 
     } 
    } 
} 
Write-Output $tagList 
Write-Output "" 
Write-Output "unique tags" 
Write-Output "-----------" 
$tagListUnique | Sort-Object -unique 

Read-Host "Press ENTER to exit" 
} 

$baseFolder = "C:\MyPictures" 
Write-Host "" 
Write-Host "Base folder: " $baseFolder 
Get-FileMetaData -folder (Get-ChildItem $baseFolder -Recurse -Directory) 

в основном это выводит итоговое заявление «Нажмите кнопку ENTER, чтобы выйти из» до массива $ tagList

Я хотел бы как раз наоборот , как в порядке, указанном в коде. mited ps skills, я понял, что есть что-то связанное в различном управлении выходным «потоком» и входом, но я не могу понять, как «очистить» весь вывод до его записи на хосте.

Заранее спасибо

+0

Если вы пытаетесь просто «просмотреть» результат, заставьте его с помощью Write-Host вместо Write-Output. Результат возвращается как часть Get-FileMetaData, а не самому хосту. Вы также захотите сделать: Write-Host ($ tagList | Out-String) –

+0

Если вы используете PowerShell v5, то можно дублировать [этот вопрос] (http://stackoverflow.com/q/34835327) , – PetSerAl

+0

@MarcKellerman спасибо за ваш совет, на самом деле с Write-Host все гладко, я уже пробовал это. Но, как вы упомянули, я не могу перенаправить вывод – doraz

ответ

0

Попробуйте это:

Function Get-FileMetaData { 

    Write-Output ([PSCustomObject]@{Value="this function is executed"}) | Out-String 

} 

Write-Output "Before function execution" 
Get-FileMetaData 
Read-Host "Press ENTER to continue" 

Ввод Read-Host ПОСЛЕ выполнения вашей функции, сделает все выводится на консоль, а затем ждать для чтения-Host к сделайте.

Результат:

enter image description here

Я обновил код, чтобы включать в себя [PSCustomObject] к Write-Output, и путем добавления Out-String в конце концов, все отлично работает для меня , Пожалуйста, дайте мне знать, если это сработает!

+0

Попробуйте изменить 'Get-FileMetaData' на' Write-Output ([PSCustomObject] @ {Value = "эта функция выполнена"}) 'и посмотреть, что произойдет. – PetSerAl

+0

Теперь попробуйте: Write-Output ([PSCustomObject] @ {Value = "эта функция выполнена"}) | Out-String –

+0

Вы отвечаете: * Помещение Read-Host ПОСЛЕ выполнения вашей функции *. Но работает ли это, если вы не конвертируете объекты в строку перед выходом? Нужно ли поместить функцию 'Read-Host' после функции, если вы конвертируете объекты в строку? Заменяет ли место 'Read-Host' (после или в конце функции) что-то? – PetSerAl

0

Не знаете, что такое техническое различие между Write-Host и Out-Host, но я обошел его, соединив пользовательский объект ($ oOptions) с Out-Host. Например:

Write-Output "Set subscription:" 
$oSubscriptions = Get-AzureRmSubscription 
If($Subscriptions.count -gt 1) 
{ 
    Write-Verbose "Multiple subscriptions found. " 
    $i=1 
    $oOptions = @() 
    $oSubscriptions | ForEach-Object{ 
     $oOptions += [pscustomobject]@{ 
      Item = $i 
      SubscriptionName = $_.SubscriptionName 
     } 
     $i++ 
    } 
    $oOptions | Out-Host 
    $selection = Read-Host -Prompt "Please make a selection" 
    $Selected = $oOptions | Where-Object{$_.Item -eq $selection} 
    $ActiveSubscription = Select-AzureRmSubscription -SubscriptionName $Selected.SubscriptionName 
    $ActiveSubscription 
    Write-Output "Subscription '$($ActiveSubscription.Subscription.SubscriptionName)' active." 
} 
else 
{ 
    $Subscriptions | Select-AzureRmSubscription | Out-Null 
} 

Надеюсь, что это поможет.

Смежные вопросы