Set-Content

Zapisuje (nadpisuje) zawartość do pliku.

Set-Content to cmdlet PowerShella, który zapisuje tekst do pliku, nadpisując jego dotychczasową zawartość. Jeśli plik nie istnieje, zostanie utworzony; jeśli istnieje, jego stara treść znika bez pytania. To powershellowy odpowiednik przekierowania > znanego z basha, tylko z pełną kontrolą nad kodowaniem, obsługą wielu plików naraz i wsparciem dla potoku. Gdy chcesz coś dopisać zamiast nadpisać, sięgasz po Add-Content — ale o tym za chwilę.

Składnia i najważniejsze opcje

Podstawowa forma to Set-Content [-Path] [-Value] . Zarówno ścieżkę, jak i wartość możesz podawać pozycyjnie albo przez potok.

  • -Path — ścieżka do pliku (lub kilku plików), do którego piszesz. Akceptuje symbole wieloznaczne.
  • -Value — treść do zapisania. Może być stringiem, tablicą stringów albo dowolnym obiektem — PowerShell zamieni go na tekst.
  • -Encoding — kodowanie pliku. Domyślnie utf8NoBOM w PowerShell 6+, ale ANSI w Windows PowerShell 5.1. Warto ustawiać jawnie.
  • -NoNewline — nie dokleja znaku nowej linii na końcu ani między elementami. Przydatne, gdy nie chcesz „osieroconego” entera.
  • -Force — nadpisuje plik tylko do odczytu (read-only). Nie łamie uprawnień systemowych, jedynie atrybut.
  • -LiteralPath — ścieżka brana dosłownie, bez interpretacji *, ? czy nawiasów. Ratuje przy dziwnych nazwach plików.
  • -WhatIf — pokazuje, co komenda by zrobiła, ale nic nie zapisuje. Test na sucho przed nadpisaniem.
  • -PassThru — zwraca zapisaną wartość do potoku, żeby móc ją od razu wykorzystać dalej.

Przykłady użycia

  • Set-Content -Path log.txt -Value "Start" — tworzy (lub czyści i nadpisuje) log.txt z jedną linią tekstu.
  • Set-Content C:\config\app.ini -Value $tresc -Encoding utf8 — zapisuje zmienną $tresc z jawnie wymuszonym UTF-8.
  • "linia1","linia2","linia3" | Set-Content plik.txt — każdy element tablicy ląduje w osobnej linii pliku.
  • Set-Content raport.csv -Value $dane -NoNewline — zapisuje bez końcowego entera, np. gdy sam zarządzasz separatorami.
  • Set-Content readonly.txt -Value "nowe" -Force — nadpisuje plik oznaczony jako tylko do odczytu.

Częste błędy i pułapki

Nadpisuje bez ostrzeżenia. To nie Add-Content — jeśli plik miał 500 linii, zostanie po nich jedna. Jak nie masz pewności, dorzuć -WhatIf.

Kodowanie różni się między wersjami. W Windows PowerShell 5.1 domyślne kodowanie to ANSI, a w PowerShell 7 to UTF-8 bez BOM. Skrypt „działający u ciebie” potrafi zepsuć polskie znaki na innej maszynie — dlatego zawsze podawaj -Encoding jawnie.

Uwaga na potok. Gdy karmisz Set-Content obiektami (nie stringami), zapisze się ich reprezentacja tekstowa ToString(), a nie sformatowana tabela, którą widzisz w konsoli. Do zrzutów obiektów lepszy bywa Out-File.

Powiązane komendy: Add-Content (dopisuje zamiast nadpisywać), Get-Content (odczyt), Out-File (zapis z formatowaniem konsolowym) oraz Clear-Content (czyści treść, zostawiając plik).