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é.
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
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
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 switch
ing 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.