web-dev-qa-db-fra.com

Write-Host => Exporter vers un fichier

J'ai un script avec quelques commandes telles que Write-Host "Server1". Comment puis-je l'exporter dans un fichier?

Quand j'ai essayé avec script > export.txt ça n'a pas marché.

14
expirat001

Write-Host redirige la sortie uniquement vers la console.

Vous pouvez utiliser Write-Output et rediriger vers un fichier (> export.txt ou diriger vers Out-File export.txt)

Dans le cas extrême où vous devez absolument rediriger toutes les sorties d'un script, jetez un œil à cette applet de commande:

Start-Transcript
Get-Help Start-Transcript -full
24
CB.

Dans PowerShell script > export.txt est du sucre syntaxique pour script | Out-File -path export.txt.

Write-Host envoie les objets à l'hôte et ne renvoie aucun objet. Cela signifie qu'aucun objet n'est dirigé vers l'applet de commande Out-File et que rien n'est écrit dans le fichier export.txt. Une solution de contournement (au cas où vous ne souhaitez pas modifier votre script) consiste à ouvrir une console cmd et à rediriger la sortie PowerShell à l'aide de la redirection de console cmd.

C:\> powershell .\script.ps1 > .\export.txt
9
jon Z

L'utilité des différentes approches dépendra largement de votre cas d'utilisation, bien sûr, mais ...

La "bonne" façon de le faire, je crois, si vous avez le contrôle des scripts (et c'est ce que je fais habituellement, bien que je cherchais un raccourci aujourd'hui), est de "" surcharge "Write-Host, pour ainsi dire, puis envoyez tout ce que vous auriez envoyé à Write-Host à cette nouvelle fonction.

Juste pour rester avec des verbes PowerShell valides, j'appelle le mien Write-Feedback.

function Write-Feedback()
{
    param
    (
        [Parameter(Position=0,ValueFromPipeline=$true)]
        [string]$msg,
        [string]$BackgroundColor = "Yellow",
        [string]$ForegroundColor = "Black"
    )

    Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg;
}

Alors maintenant, vous avez une fonction qui fonctionne essentiellement de manière identique à Write-Host, mais vous pouvez facilement contrôler où va la sortie. Si vous devez écrire dans un fichier, vous pouvez modifier Write-Feedback pour que tous ses appels fassent maintenant tout ce dont vous avez besoin.

Vous pouvez simplement changer la ligne en Write-Output, selon que vous faites autre chose en cours de route ...

...
Write-Output $msg;

Vous pouvez envoyer la sortie dans le même fichier vers lequel vous dirigez le reste de la commande, mais dans le Write-Feedback, même en conservant l'hôte d'écriture:

function Write-Feedback()
{
    param
    (
        [Parameter(Position=0,ValueFromPipeline=$true)]
        [string]$msg,
        [string]$BackgroundColor = "Yellow",
        [string]$ForegroundColor = "Black"
    )

    Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg;
    $msg | Out-File "./export.txt" -Append; # <<< or add a param to location
}

Ou si vous avez quelques valeurs aberrantes où vous ne voulez pas que le Write-Feedback contenu à rediriger vers un fichier, vous pouvez ajouter un nouveau paramètre facultatif qui demande quoi faire avec chaque Write-Feedback appeler que vous switch hors - et envoyer au fichier, à Write-Host, à Write-Output, etc - changer la valeur par défaut à ce que vous voulez habituellement, et explicitement switching hors du nouveau paramètre où il est explicitement défini.

Etc., etc. Il est tellement plus facile d'acheminer tous vos appels vers un centre d'échange centralisé pour sortie dans PowerShell. Ensuite, lorsque vous changez d'avis , ce n'est pas une tâche énorme de recherche et de remplacement - et de remplacement -.

Je pense que la seule douleur ici serait si vous ne vouliez pas envoyer des choses dans le pipeline, donc Write-Output est sorti, mais voulait s'assurer que le fichier Write-Feedback a écrit était identique à ce que vous avez spécifié dans le > export.txt de votre exemple sans modification Write-Feedback chaque fois. Je ne sais pas s'il existe un moyen facile de le faire.

Mais comme vous ne seriez alors plus qu'à une étape de votre "étape de pipe", ce n'est probablement pas un cas d'utilisation légitime.

Quoi qu'il en soit, l'essentiel est de surcharger Write-Host et faites ce que vous voulez en éditant au même endroit.

6
ruffin