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.