Working with files and folders
Procházení jednotek PowerShellu a manipulace s položkami na nich je podobná manipulaci se soubory a složkami na diskových jednotkách Windows. Tento článek popisuje, jak pracovat s konkrétními úlohami manipulace se soubory a složkami pomocí PowerShellu.
Výpis všech souborů a složek v rámci složky
Všechny položky můžete získat přímo ve složce pomocí Get-ChildItem
. Přidejte volitelný parametr Force pro zobrazení skrytých nebo systémových položek. Tento příkaz například zobrazí přímý obsah jednotky PowerShellu C:
.
Get-ChildItem -Path C:\ -Force
Příkaz vypíše jenom přímo obsažené položky, podobně jako příkaz dir
v cmd.exe
prostředí systém UNIX nebo ls
v něm. Pokud chcete zobrazit položky v podsložce, musíte zadat parametr Recurse .
Následující příkaz zobrazí seznam všech položek na jednotce C:
:
Get-ChildItem -Path C:\ -Force -Recurse
Get-ChildItem
může filtrovat položky s parametry Cesta, Filtr, Zahrnout a Vyloučit , ale ty jsou obvykle založeny pouze na názvu. Můžete provádět složité filtrování na základě jiných vlastností položek pomocí Where-Object
.
Následující příkaz najde všechny spustitelné soubory ve složce Program Files, které byly naposledy změněny po 1. říjnu 2005 a které nejsou menší než 1 megabajt ani větší než 10 megabajtů:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
Where-Object -FilterScript {
($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
}
Kopírování souborů a složek
Kopírování se provádí pomocí Copy-Item
funkce . Následující příkaz zálohuje skript profilu PowerShellu:
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}
Příkaz Test-Path
zkontroluje, jestli existuje skript profilu.
Pokud cílový soubor již existuje, pokus o kopírování selže. Pokud chcete přepsat existující cíl, použijte parametr Force :
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}
Tento příkaz funguje i v případě, že cíl je jen pro čtení.
Kopírování složek funguje stejně. Tento příkaz zkopíruje složku C:\temp\test1
do nové složky C:\temp\DeleteMe
rekurzivně:
Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe
Můžete také zkopírovat výběr položek. Následující příkaz zkopíruje všechny .txt
soubory obsažené kdekoli:C:\data
C:\temp\text
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
Stále můžete spouštět nativní příkazy jako xcopy.exe
a robocopy.exe
kopírovat soubory.
Vytváření souborů a složek
Vytváření nových položek funguje stejně u všech poskytovatelů PowerShellu. Pokud má zprostředkovatel PowerShellu více než jeden typ položky – například zprostředkovatel PowerShellu Pro systém souborů rozlišuje mezi adresáři a soubory – musíte zadat typ položky.
Tento příkaz vytvoří novou složku C:\temp\New Folder
:
New-Item -Path 'C:\temp\New Folder' -ItemType Directory
Tento příkaz vytvoří nový prázdný soubor. C:\temp\New Folder\file.txt
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File
Důležité
Při použití přepínače Force s New-Item
příkazem k vytvoření složky a složka již existuje, nepřepíše ani nenahradí složku. Jednoduše vrátí existující objekt složky. Pokud však použijete New-Item -Force
soubor, který již existuje, soubor se přepíše.
Odebrání všech souborů a složek ve složce
Obsažené položky můžete odebrat pomocí Remove-Item
, ale zobrazí se výzva k potvrzení odebrání, pokud položka obsahuje něco jiného. Pokud se například pokusíte odstranit složku C:\temp\DeleteMe
, která obsahuje další položky, PowerShell vás před odstraněním složky vyzve k potvrzení:
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"):
Pokud nechcete být vyzváni pro každou obsaženou položku, zadejte parametr Recurse :
Remove-Item -Path C:\temp\DeleteMe -Recurse
Mapování místní složky jako jednotky
Pomocí příkazu můžete také namapovat místní složku New-PSDrive
. Následující příkaz vytvoří místní jednotku P:
kořenovou složku v místním adresáři Program Files, která se zobrazí jenom z relace PowerShellu:
New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem
Stejně jako u síťových jednotek jsou jednotky mapované v PowerShellu okamžitě viditelné v prostředí PowerShell. Pokud chcete vytvořit mapovanou jednotku viditelnou z Průzkumník souborů, použijte parametr Zachovat. S trvalým ukládáním se ale dají použít jenom vzdálené cesty.
Čtení textového souboru do pole
Jeden z nejběžnějších formátů úložiště textových dat je v souboru s samostatnými řádky, které jsou považovány za odlišné datové prvky. Rutinu Get-Content
můžete použít ke čtení celého souboru v jednom kroku, jak je znázorněno tady:
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
zpracovává data načtená ze souboru jako pole s jedním prvkem na řádek obsahu souboru. Můžete to ověřit kontrolou délky vráceného obsahu:
PS> (Get-Content -Path $PROFILE).Length
3
Tento příkaz je nejužitečnější pro získání seznamů informací do PowerShellu. Můžete například uložit seznam názvů počítačů nebo IP adres v souboru C:\temp\domainMembers.txt
s jedním názvem na každém řádku souboru. Můžete použít Get-Content
k načtení obsahu souboru a jejich vložení do proměnné $Computers
:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers
je teď pole obsahující název počítače v každém prvku.