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-Itemfunkce . 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:\dataC:\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.txts 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.