Comment créez-vous un format de fichier unix dans Powershell? J’utilise les éléments suivants pour créer un fichier, mais il le crée toujours au format Windows.
"hello world" | out-file -filepath test.txt -append
Si je comprends bien, les nouveaux caractères de ligne CRLF en font un fichier au format Windows alors que le format unix ne nécessite qu’un LF à la fin de la ligne. J’ai essayé de remplacer le CRLF par ce qui suit, mais cela n’a pas fonctionné
"hello world" | %{ $_.Replace("`r`n","`n") } | out-file -filepath test.txt -append
Une réponse moche est (en prenant entrée de dos.txt sortie à unix.txt):
[ssortingng]::Join( "`n", (gc dos.txt)) | sc unix.txt
mais j’aimerais vraiment pouvoir faire en sorte que Set-Content le fasse tout seul et que cette solution ne soit pas diffusée et ne fonctionne donc pas bien sur les gros fichiers …
Et cette solution mettra fin au fichier avec une ligne DOS se terminant aussi … donc ce n’est pas 100%
Il existe une applet de commande dans les extensions de la communauté PowerShell, appelée ConvertTo-UnixLineEnding.
J’ai trouvé cette solution:
sc unix.txt ([byte[]][char[]] "$contenttext") -Encoding Byte
Posté ci-dessus, échoue sur les conversions de codage dans certains cas.
Donc, voici encore une autre solution (un peu plus détaillée, mais qui fonctionne directement avec les octets):
function ConvertTo-LinuxLineEndings($path) { $oldBytes = [io.file]::ReadAllBytes($path) if (!$oldBytes.Length) { return; } [byte[]]$newBytes = @() [byte[]]::Resize([ref]$newBytes, $oldBytes.Length) $newLength = 0 for ($i = 0; $i -lt $oldBytes.Length - 1; $i++) { if (($oldBytes[$i] -eq [byte][char]"`r") -and ($oldBytes[$i + 1] -eq [byte][char]"`n")) { continue; } $newBytes[$newLength++] = $oldBytes[$i] } $newBytes[$newLength++] = $oldBytes[$oldBytes.Length - 1] [byte[]]::Resize([ref]$newBytes, $newLength) [io.file]::WriteAllBytes($path, $newBytes) }