How do I output text without a newline in PowerShell?

前端 未结 17 2234
独厮守ぢ
独厮守ぢ 2020-12-07 15:13

I want my PowerShell script to print something like this:

Enabling feature XYZ......Done

The script looks something like this:



        
相关标签:
17条回答
  • 2020-12-07 15:41

    Unfortunately, as noted in several answers and comments, Write-Host can be dangerous and cannot be piped to other processes and Write-Output does not have the -NoNewline flag.

    But those methods are the "*nix" ways to display progression, the "PowerShell" way to do that seems to be Write-Progress: it displays a bar at the top of the PowerShell window with progress information, available from PowerShell 3.0 onward, see manual for details.

    # Total time to sleep
    $start_sleep = 120
    
    # Time to sleep between each notification
    $sleep_iteration = 30
    
    Write-Output ( "Sleeping {0} seconds ... " -f ($start_sleep) )
    for ($i=1 ; $i -le ([int]$start_sleep/$sleep_iteration) ; $i++) {
        Start-Sleep -Seconds $sleep_iteration
        Write-Progress -CurrentOperation ("Sleep {0}s" -f ($start_sleep)) ( " {0}s ..." -f ($i*$sleep_iteration) )
    }
    Write-Progress -CurrentOperation ("Sleep {0}s" -f ($start_sleep)) -Completed "Done waiting for X to finish"
    

    And to take the OP's example:

    # For the file log
    Write-Output "Enabling feature XYZ"
    
    # For the operator
    Write-Progress -CurrentOperation "EnablingFeatureXYZ" ( "Enabling feature XYZ ... " )
    
    Enable-SPFeature...
    
    # For the operator
    Write-Progress -CurrentOperation "EnablingFeatureXYZ" ( "Enabling feature XYZ ... Done" )
    
    # For the log file
    Write-Output "Feature XYZ enabled"
    
    0 讨论(0)
  • 2020-12-07 15:43

    Write-Host is terrible, a destroyer of worlds, yet you can use it just to display progress to a user whilst using Write-Output to log (not that the OP asked for logging).

    Write-Output "Enabling feature XYZ" | Out-File "log.txt" # Pipe to log file
    Write-Host -NoNewLine "Enabling feature XYZ......."
    $result = Enable-SPFeature
    $result | Out-File "log.txt"
    # You could try{}catch{} an exception on Enable-SPFeature depending on what it's doing
    if ($result -ne $null) {
        Write-Host "complete"
    } else {
        Write-Host "failed"
    }
    
    0 讨论(0)
  • 2020-12-07 15:44

    While it may not work in your case (since you're providing informative output to the user), create a string that you can use to append output. When it's time to output it, just output the string.

    Ignoring of course that this example is silly in your case but useful in concept:

    $output = "Enabling feature XYZ......."
    Enable-SPFeature...
    $output += "Done"
    Write-Output $output
    

    Displays:

    Enabling feature XYZ.......Done
    
    0 讨论(0)
  • 2020-12-07 15:46

    The problem that I hit was that Write-Output actually linebreaks the output when using using PowerShell v2, at least to stdout. I was trying to write an XML text to stdout without success, because it would be hard wrapped at character 80.

    The workaround was to use

    [Console]::Out.Write($myVeryLongXMLTextBlobLine)
    

    This was not an issue in PowerShell v3. Write-Output seems to be working properly there.

    Depending on how the PowerShell script is invoked, you may need to use

    [Console]::BufferWidth =< length of string, e.g. 10000)
    

    before you write to stdout.

    0 讨论(0)
  • 2020-12-07 15:49

    The following will place the cursor back at beginning of the previous row. It's up to you to place it in the right horizontal position (using $pos.X to move it sideways):

    $pos = $host.ui.RawUI.get_cursorPosition()
    $pos.Y -= 1
    $host.UI.RawUI.set_cursorPosition($Pos)
    

    Your current output is 27 spaces over, so $pos.X = 27 might work.

    0 讨论(0)
  • 2020-12-07 15:50

    To write to a file you can use a byte array. The following example creates an empty ZIP file, which you can add files to:

    [Byte[]] $zipHeader = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    [System.IO.File]::WriteAllBytes("C:\My.zip", $zipHeader)
    

    Or use:

    [Byte[]] $text = [System.Text.Encoding]::UTF8.getBytes("Enabling feature XYZ.......")
    [System.IO.File]::WriteAllBytes("C:\My.zip", $text)
    
    0 讨论(0)
提交回复
热议问题