Praca z plikami i folderami

Nawigowanie po dyskach programu PowerShell i manipulowanie elementami na nich jest podobne do manipulowania plikami i folderami na dyskach z systemem Windows. W tym artykule omówiono sposób radzenia sobie z określonymi zadaniami manipulowania plikami i folderami przy użyciu programu PowerShell.

Wyświetlanie listy wszystkich plików i folderów w folderze

Wszystkie elementy można pobrać bezpośrednio w folderze przy użyciu polecenia Get-ChildItem. Dodaj opcjonalny parametr Force , aby wyświetlić ukryte lub systemowe elementy. Na przykład to polecenie wyświetla bezpośrednią zawartość dysku C:programu PowerShell .

Get-ChildItem -Path C:\ -Force

Polecenie wyświetla tylko bezpośrednio zawarte elementy, podobnie jak użycie dir polecenia w cmd.exe powłoce system UNIX lub ls w powłoce system UNIX. Aby wyświetlić elementy w podfolderze, należy określić parametr Recurse . Następujące polecenie wyświetla listę wszystkich elementów na C: dysku:

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItem może filtrować elementy za pomocą parametrów Path, Filter, Include i Exclude , ale są one zwykle oparte tylko na nazwie. Można wykonywać złożone filtrowanie na podstawie innych właściwości elementów przy użyciu polecenia Where-Object.

Następujące polecenie znajduje wszystkie pliki wykonywalne w folderze Program Files, które zostały ostatnio zmodyfikowane po 1 października 2005 r., i które nie są ani mniejsze niż 1 megabajt, ani większe niż 10 megabajtów:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

Kopiowanie plików i folderów

Kopiowanie odbywa się za pomocą polecenia Copy-Item. Następujące polecenie wykonuje kopię zapasową skryptu profilu programu PowerShell:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

Polecenie Test-Path sprawdza, czy skrypt profilu istnieje.

Jeśli plik docelowy już istnieje, próba kopiowania zakończy się niepowodzeniem. Aby zastąpić wstępnie istniejące miejsce docelowe, użyj parametru Force :

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

To polecenie działa nawet wtedy, gdy miejsce docelowe jest tylko do odczytu.

Kopiowanie folderów działa w taki sam sposób. To polecenie kopiuje folder C:\temp\test1 do nowego folderu C:\temp\DeleteMe rekursywnie:

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Możesz również skopiować wybór elementów. Następujące polecenie kopiuje wszystkie .txt pliki znajdujące się w dowolnym miejscu do C:\data pliku C:\temp\text:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

Nadal można uruchamiać natywne polecenia, takie jak xcopy.exe i robocopy.exe , do kopiowania plików.

Tworzenie plików i folderów

Tworzenie nowych elementów działa tak samo we wszystkich dostawcach programu PowerShell. Jeśli dostawca programu PowerShell ma więcej niż jeden typ elementu — na przykład dostawca programu PowerShell fileSystem rozróżnia katalogi i pliki — należy określić typ elementu.

To polecenie tworzy nowy folder C:\temp\New Folder:

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

To polecenie tworzy nowy pusty plik C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

Ważne

W przypadku użycia przełącznika Force z New-Item poleceniem w celu utworzenia folderu, a folder już istnieje, nie zastąpi ani nie zastąpi folderu. Spowoduje to po prostu zwrócenie istniejącego obiektu folderu. Jeśli jednak używasz New-Item -Force pliku, który już istnieje, plik zostanie zastąpiony.

Usuwanie wszystkich plików i folderów w folderze

Możesz usunąć zawarte elementy przy użyciu polecenia Remove-Item, ale zostanie wyświetlony monit o potwierdzenie usunięcia, jeśli element zawiera inne elementy. Jeśli na przykład próbujesz usunąć folder C:\temp\DeleteMe zawierający inne elementy, program PowerShell wyświetli monit o potwierdzenie przed usunięciem folderu:

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

Jeśli nie chcesz monitować o podanie każdego zawartego elementu, określ parametr Recurse :

Remove-Item -Path C:\temp\DeleteMe -Recurse

Mapowanie folderu lokalnego jako dysku

Możesz również mapować folder lokalny przy użyciu New-PSDrive polecenia . Następujące polecenie tworzy dysk P: lokalny root w lokalnym katalogu Program Files widoczny tylko z sesji programu PowerShell:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Podobnie jak w przypadku dysków sieciowych dyski mapowane w programie PowerShell są natychmiast widoczne dla powłoki programu PowerShell. Aby utworzyć zamapowany dysk widoczny na podstawie Eksplorator plików, użyj parametru Persist. Można jednak używać tylko ścieżek zdalnych z funkcją Persist.

Odczytywanie pliku tekstowego do tablicy

Jednym z bardziej typowych formatów magazynu danych tekstowych jest plik z oddzielnymi wierszami traktowanymi jako odrębne elementy danych. Polecenie Get-Content cmdlet może służyć do odczytywania całego pliku w jednym kroku, jak pokazano poniżej:

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

Get-Content traktuje dane odczytane z pliku jako tablicę z jednym elementem na wiersz zawartości pliku. Możesz to potwierdzić, sprawdzając długość zwróconej zawartości:

PS> (Get-Content -Path $PROFILE).Length
3

To polecenie jest najbardziej przydatne w przypadku pobierania list informacji do programu PowerShell. Można na przykład przechowywać listę nazw komputerów lub adresów IP w pliku C:\temp\domainMembers.txt, z jedną nazwą w każdym wierszu pliku. Możesz użyć Get-Content polecenia , aby pobrać zawartość pliku i umieścić je w zmiennej $Computers:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers jest teraz tablicą zawierającą nazwę komputera w każdym elemecie.