web-dev-qa-db-fra.com

Ajouter une nouvelle ligne (saut de ligne) à un script Powershell

J'exécute un script dans Powershell et je souhaite pouvoir insérer une ligne dans le résultat de mon fichier texte résultant entre le nom du script et le contenu du script. 

Actuellement, dans la liste ci-dessous, la ligne $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName) est ce dont j'ai besoin, mais il me faut une ligne pour séparer $file et le résultat de l'expression suivante. Comment puis-je faire ceci?

foreach ($file in [System.IO.Directory]::GetFiles($sqldir,"*.sql", 
  [System.IO.SearchOption]::AllDirectories))
{
  $file = [System.IO.FileInfo]::new($file);


  $Log.SetLogDir("");
  $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName);


  $Log.AddMsg($str_msg);
  Write-Output $str_msg;


  # ...

}
3
voot89
  • $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName) ne crée pas string, il crée un array([object[]]) à 2 éléments, composé de l'instance $file[System.IO.FileInfo] et de la chaîne contenant le contenu de ce fichier.

  • Vraisemblablement, la méthode .AddMsg() attend une seule chaîne, aussi PowerShell stringifies le tableau afin de le convertir en une seule chaîne; PowerShell renforce un tableau en concaténant les éléments avec un seul espace comme séparateurpar défaut; Par exemple :[string] (1, 2) donne '1 2'.

Par conséquent, il est préférable de commencer par composer $str_msg en tant que string, avec une nouvelle ligne explicite comme séparateur , par exemple:

$strMsg = "$file`r`n$([System.IO.File]::ReadAllText($file.FullName))"

Notez l'utilisation de la séquence d'échappement "`r`n" pour produire un CRLF, la séquence de nouvelle ligne spécifique à Windows; sur les plates-formes Unix, vous utiliseriez seulement "`n" (LF).

.NET propose une abstraction multiplateforme, [Environment]::NewLine, qui renvoie la séquence de nouvelle ligne appropriée à la plate-forme (que vous pouvez également incorporer sous la forme $([Environment]::NewLine) dans "...").

Une alternative à l'interpolation de chaîne consiste à utiliser -f, l'opérateur de formatage de chaîne, basé sur la méthode .NET String.Format():

$strMsg = '{0}{1}{2}' -f $file, 
                        [Environment]::NewLine, 
                        [System.IO.File]::ReadAllText($file.FullName)
2
mklement0

Vous devez utiliser le caractère spécial carrous return powershell, qui est "` r ".

Utilisez-le comme ceci pour ajouter un retour à la ligne dans votre ligne:

$str_msg = $file,"`r",[System.IO.File]::ReadAllText($file.FullName);

Consultez cette documentation pour avoir plus de détails sur les caractères spéciaux de Poewershell.

0
Léo D.

Bravo à la première réponse

Backtick-r + backtick-n effectuera un retour chariot avec une nouvelle ligne dans PS. Vous pouvez faire un contenu de votre variable $ file en tant que nouvelle variable de tableau et insérer le retour chariot à un index particulier:

Exemple de fichier: test123.txt

Si le contenu du fichier était ceci:

line1
line2
line3

Stocker le contenu dans une variable de type tableau afin que vous ayez des index

[Array]$fileContent = Get-Content C:\path\to\test123.txt

Pour ajouter un retour chariot entre line2 et line3:

$fileContent2 = $fileContent[0..1] + "`r`n" + $fileContent[2]

Puis sortez un nouveau fichier:

$fileContent2 | Out-File -FilePath C:\path\to\newfile.txt

J'espère que cette autre approche aidera les futurs demandeurs de réponses

0
trebleCode