Write-Host is appropriate for scripts which must create host display without affecting script output / function return values.
Emphasis on must because by and large doing so can be obnoxious or unnecessary, and limits the reusability of your code. Ideally, you would have the bulk of your code written entirely without Write-Host, and then you would execute your code with a wrapper script that included the necessary Write-Host lines.
Write-Information is good for similar kinds of information, if you don’t need it to display by default. It will still be there if it is needed, but it does not display by default (although it is logged by default if you have logging enabled).
For most things, I consider Write-Verbose to be more than sufficient; if users want to view it, they can call your script with the -Verbose flag (note that you will need to apply [CmdletBinding()] to your script to enable the verbose messaging properly, however).
In a majority of cases, if you have a “need” for Write-Host it’s because:
- You have a lengthy script (in which case you should optimize it and perhaps utilise Write-Progress if the time is an acceptable / unavoidable consequence of what it needs to do)
- You're providing user feedback in an interactive script (any interactive portions should be clearly and completely separate from operational parts of the script to maximise reusability)
- You're using it because your logging needs something to log (in which case just use Write-Verbose and call the script with -Verbose when you need to log the data -- OR accept that there will be no interactive output and just use Write-Information)