Sdílet prostřednictvím


Práce se soubory a složkami

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 PowerShell C:.

Get-ChildItem -Path C:\ -Force

Příkaz vypíše pouze přímo obsažené položky, podobně jako příkaz dir v cmd.exe nebo ls v prostředí unix. Pokud chcete zobrazit položky v podsložce, musíte zadat parametr Recurse. Následující příkaz vypíše vše na jednotce C::

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

Get-ChildItem může filtrovat položky pomocí svých parametrů: Cesta, Filtr, Zahrnutía Vyloučení, ale ty jsou obvykle založené jenom na názvu. Pomocí Where-Objectmůžete provádět složité filtrování na základě jiných vlastností položek.

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. 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 soubory .txt obsažené kdekoli v C:\data do 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 je xcopy.exe a robocopy.exe ke kopírování souborů.

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 příkazem New-Item vytvořte složku a složka již existuje, přepsat ani nahradit složku. Jednoduše vrátí existující objekt složky. Pokud však použijete New-Item -Force u souboru, 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, aby se zobrazila výzva k zadání jednotlivých obsažených položek, zadejte parametr Recurse:

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

Mapování místní složky jako jednotky

Místní složku můžete také mapovat pomocí příkazu New-PSDrive. Následující příkaz vytvoří místní jednotku P: kořenovou v místním adresáři Program Files, která je viditelná pouze během 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íka souborů, použijte parametr Zachovat. V tomto případě lze použít pouze vzdálené cesty s Zachovat.

Č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 tak, že zkontrolujete délku 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. Pomocí Get-Content můžete načíst obsah souboru a vložit je 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.