Sådan administreres filer med Powershell

Sidste ændring: 04/10/2024
Sådan administreres filer med Powershell

Hver dag skal systemadministratorer udføre adskillige standardhandlinger på de mange filer og mapper på deres Windows- servere . Disse opgaver involverer ofte administration af brugerdata på delte ressourcer og sikring af korrekte sikkerhedskopier. For at reducere mængden af ​​manuelt arbejde, kan du bruge PowerShell.

I denne artikel lærer du, hvordan du bruger PowerShell til at:

  • Vis objekter i en mappe
  • Opret filer og mapper
  • Slet filer og mapper
  • Kopier filer og mapper
  • Flyt filer eller mapper
  • Omdøb filer
  • Skift filtypenavne
  • Og meget mere

Før du begynder, skal du sørge for, at din systempolitik tillader dig at køre PowerShell-scripts.

Vis objekter i en mappe

For at se indholdet af en mappe på en Windows-filserver skal du bruge cmdlet'en Get-ChildItem . For at vise alle skjulte filer skal du tilføje parameteren -Force. Følgende kommando viser alle rodobjekter i mappen "Delt".

Her kan du læse om: Rettelse: Opdateringen er ikke relevant for din enhed

  • Get-ChildItem -Force \\ fs \ Shared

Hvis du også vil se alle undermapper og deres indhold, skal du tilføje parameteren -Recurse:

  • Get-ChildItem -Force \\ fs \ Shared -Recurse

For at filtrere resultaterne skal du tilføje parametrene Filter, Exclude, Include og Path til cmdlet'en Get-ChildItem . Brug cmdlet'en Where-Object til avanceret objektfiltrering . Scriptet nedenfor søger efter alle eksekverbare filer i TI-arkivet, der er blevet ændret efter 1. april 2018.

  • Get-ChildItem -Sti \\ fs \ Shared \ IT -Recurse -Include * .exe | Where-Object -FilterScript {($ _.LastWriteTime -gt '2018-04-01')}

Opret filer og mapper med PowerShell

For at oprette nye objekter med Windows PowerShell kan du bruge cmdlet'en New-Item og angive den type element, du vil oprette, f.eks. en mappe, fil eller registreringsdatabasenøgle.

Denne kommando opretter for eksempel en mappe:

  • New-Item -Sti '\\fs\Shared\NewFolder' -ItemType Directory

Og dette opretter en tom fil:

  • New-Item -Sti '\\fs\Shared\NewFolder\newfile.txt' -ItemType File

Opret filer og skriv data til dem

Der er mindst to indbyggede metoder til at oprette en fil og skrive data til den. Den første er at bruge cmdlet'en Out-File :

  • $text = 'Hej verden!' | Outputfil $text-FilePath C:\data\text.txt

For at overskrive en eksisterende fil, brug parameteren switch –Force. Du kan også oprette filer med Export-Csv cmdlet'en, som eksporterer resultatet til en csv-fil, der kan åbnes i Excel:

  • Get-ADuse -Filter * | Export-Csv -Sti C:\data\ADusars.csv

Opret filer efter at have bekræftet, at de ikke allerede eksisterer

Følgende script kontrollerer, om en specifik fil (pctxt) allerede findes i en bestemt mappe. Hvis filen ikke allerede findes, genererer scriptet en liste over alle Active Directory-computere og gemmer den i en ny fil med navnet pctxt.

# opretter en række tekstfiler

$files = Get-ChildItem C:\data\*. txt | vælg -udvid fulde navn

# tjek om filen findes i strengen

$filer -match "pc.txt"

# hvis matchet returnerer "True", afslut, hvis det returnerer "False", opret en rapport

if ($filer -eq 'False') {

Get-ADComputer -Filter * | Export-Csv -Sti C:\data\pc.txt

}

mere {exit}

Slet filer og mapper med PowerShell

For at fjerne elementer skal du bruge Remove-Item cmdlet'en. Du skal huske på, at du bliver bedt om bekræftelse ved kørsel, hvis objektet ikke er tomt. Følgende eksempel viser, hvordan man sletter IT-mappen, alle dens undermapper og de filer, den indeholder:

Delete-Element-Path '\\ fs \ shared \ it \'

Bekræft

Elementet i \\ pdc \ shared \ har børn, og Recurse-parameteren blev ikke angivet. Hvis du fortsætter, vil alle børn blive fjernet med elementet.

Er du sikker på, at du vil fortsætte?

[Y] Ja [A] Ja til alle [N] Nej [L] Nej til alle [S] Suspend [?] Hjælp

(standard er "Y"):

Hvis du allerede har bekræftet, at alle objekter i en mappe skal slettes, kan du så bruge kontakten? Tilbage for at springe bekræftelsestrinnet over:

  • Delete-Item -Sti '\\ fs \shared \it \' -Recurse

Slet filer og mapper ældre end X dage

Nogle gange er det nødvendigt at rense gamle filer fra en bestemt mappe. Sådan udføres denne opgave:

$Folder = "C:\Backups"

#fjern filer, der er ældre end 30 dage

Get-ChildItem $Folder -Recurse -Force -ea 0 |

? {! $_. PsIsContainer -og $_. LastWriteTime -lt (Get-Date).AddDays (-30)} |

ForEach-Object {

$_ | -Kraft

$_. Fuldt navn | Outputfil C:\log\deletedbackups.txt -Append

}

Slet filer efter at have bekræftet, at de eksisterer

Sådan bekræfter du, at en fil eksisterer, og sletter den, hvis den findes:

$FileName = 'C:\data\log.txt'

If (Test-Path $FileName) {

   Slet element $FileName

}

Slet filer på flere computere med et enkelt script

For at slette filer på fjerncomputere skal du have sikkerhedstilladelser for at få adgang til dem. Sørg for at bruge UNC-stier, så scriptet korrekt bestemmer placeringen af ​​filerne.

  Sådan bruger du Btrfs-undervolumener: en komplet og praktisk guide

$filelist = @(«\c$\Temp», «\c$\Backups») # variabel til at slette filer og mapper

$computerlist = Hent-indhold C:\data\pc.txt # hent liste over fjerncomputere

    foreach ($computer i $liste over computere) {

        foreach ($file i $filelist) {

            $filepath = Join-sti «\\$computer\» «$filelist» # generer unc-stier til filer og mapper

            if (teststi $filsti)

            {

            Slet element $filepath -force -recurse -ErrorAction Fortsæt}}}

Kopier filer og mapper med PowerShell

Cmdlet'en Copy -Item giver dig mulighed for at kopiere objekter fra én sti til en anden. Følgende kommando opretter en sikkerhedskopi ved at kopiere usars.xlsx-filen fra en fjerncomputer (fs) og gemme den på en anden computer (fs2) via netværket:

  • Kopiér element -Sti\\ fs\Delt\it\usas.xlsx -Destination\\ fs2\Backups\it\usas.xlsx

Hvis destinationsfilen allerede findes, mislykkes kopieringsforsøget. For at overskrive den eksisterende fil, selvom den er skrivebeskyttet, skal du bruge parameteren -Force.

  • Kopier element -Sti\\ fs\Delt\it\usas.xlsx -Destination\\ fs2\Backups\it\usas.xlsx -Force

Kopier filer med PowerShell til eller fra en fjerncomputer

Hvis du kopierer filer til eller fra fjerncomputere, skal du sørge for at bruge UNC-stier.

Brug for eksempel denne kommando til at kopiere filer fra en ekstern filserver til den lokale C:-mappe:

  • Kopier element \\ fs \ c $ \ temp -Recurse C: \ data \

For at kopiere filer fra din lokale mappe til fjernmappen skal du blot vende kilde- og destinationsplaceringerne om:

  • Kopier element C:\data\-Recurse\\fs\c$\temp

Kopier flere filer fra en server til en anden over netværket ved hjælp af et script

Du kan også kopiere filer fra én fjernserver til en anden. Følgende script kopierer rekursivt mappen \\fs\Shared\temp til \\fs\Shared\test :

  • Kopier element \\ fs \ Shared \ temp -Recurse \\ fs \ Shared \ test

Kopier kun visse typer filer

Brug parameteren -Filter for kun at kopiere bestemte filer fra kilden til destinationen. For eksempel kopierer følgende kommando kun txt-filer fra en mappe til en anden:

  • Kopier element -Filter *.txt -Sti \\ fs \ Shared \ it -Recurse -Destination \\ fs2 \ Shared \ text

Kopier filer ved hjælp af XCOPY- og ROBOCOPY-kommandoer eller COM-objekter

Du kan også køre kommandoerne XCOPY og ROBOCOPY for at kopiere filer eller bruge COM-objekter, som i følgende eksempel:

  • (New-Object -ComObject Scripting.FileSystemObject).CopyFile('\\fs\Shared', 'fs2\Backup')

Flyt filer og mapper med PowerShell

Cmdlet'en Move-Item flytter et element sammen med dets egenskaber, indhold og underordnede elementer fra én placering til en anden. Den kan også flytte en fil eller undermappe fra én mappe til en anden placering.

Følgende kommando flytter en specifik sikkerhedskopifil fra en placering til en anden:

  • Flyt-item -sti \\ fs \ Delt \ Sikkerhedskopier \ 1.bak -Destination \\ fs2 \ Sikkerhedskopier \ arkiv \ 1.bak

Dette script flytter hele mappen Backups og dens indhold til en anden placering:

  • Flyt-item -sti \\ fs \ Delt \ Backups -Destination \\ fs2 \ Backups \ arkiv

Sikkerhedskopieringsmappen og alle dens filer og undermapper vises i arkivmappen.

Omdøb filer med Powershell

Med cmdlet'en Rename-Item kan du omdøbe et objekt uden at ændre dets indhold. Det er ikke muligt at flytte elementer ved hjælp af kommandoen Rename-Item. For at gøre dette skal du bruge cmdlet'en Move-Item, som forklaret tidligere.

Følgende kommando omdøber en fil:

  • Omdøb element -sti «\\fs\Shared\temp.txt» -Nyt navn «ny_temp.txt»

Omdøb flere filer

For at omdøbe flere filer samtidigt, brug et script som dette:

$files = Get-ChildItem -Sti C:\Temp #opret liste over filer

foreach ($file i $filer)

{

    $newFileName = $file.Name.Replace("A", "B") #erstat "A" med "B"

    Omdøb elementet $file $newFileName

}

Rediger filtypenavne med PowerShell

Du kan også bruge Rename-Item til at ændre filtypenavne. Hvis du vil ændre filtypenavnene på flere filer på samme tid, skal du bruge cmdlet'en Rename-Item sammen med cmdlet'en Get-ChildItem.

Følgende script ændrer alle filtypenavne fra "txt" til "bak". Jokertegnet (*) bruges til at inkludere alle tekstfiler:

  • Get-ChildItem \\ fs \ Shared \ Logs \ *. Txt | Omdøb element - Nyt navn {$_. Navn - Erstat '\.txt$', '. Bak'}

Get-Content - Hvordan læser man indholdet af en fil i PowerShell?

Get-Content-cmdlet'en er en af ​​de kommandoer, du skal have, når du analyserer PowerShell-scripts. Det giver dig mulighed for at læse indholdet af en fil i PowerShell, hvilket er en meget almindelig handling. Ud over at læse dataene, kan vi importere dataene til en variabel til brug i PowerShell-scriptet. Du kan bruge Get-Content til f.eks. at hente indholdet af en logfil.

  Fedora 44 beta med KDE Plasma: alle de nye funktioner

Vi vil se, at Get-Content er en kraftfuld cmdlet, der er i stand til at gøre mere end blot at hente hele indholdet af en fil, deraf interessen i at dedikere en hel artikel til den. Denne cmdlet fungerer i Windows PowerShell 5.1 og PowerShell, inklusive den seneste version til dato: PowerShell 7.1.1.

II. Du skal blot læse indholdet af en fil

Til at begynde med læser vi blot indholdet af en tekstfil, der indeholder en liste over værdier. For at følge denne del af vejledningen skal du oprette en fil med navnet " Paystxt " og gemme den i " C:\TEMP ". Denne fil skal indeholde følgende:

  • Frankrig
  • Costa Rica
  • Belgien
  • Suizo
  • Spanien
  • Colombia
  • Canada
  • Brasil
  • Island
  • Nicaragua

Trin til at læse indholdet i Powershell

  1. trin 1: For at læse og vise indholdet af denne fil i konsollen er kommandoen super enkel, da du blot skal angive navnet på filen (eller den fulde sti, hvis den ikke er i den aktuelle mappe):
  2. trin 2: Du får indholdet «C:\TEMP\Pays txt»
C:\TEMP\Pays txt
C:\TEMP\Pays txt
  1. trin 3: Parameteren -Sti vil blive brugt implicit for denne værdi. Hvis vi skriver kommandoen nedenfor, er den den samme.
    1. Get-Content -Sti «C:\TEMP\Pays txt»

BEMÆRK : Det er ikke særlig nyttigt at vise indhold i konsollen. Det er mere interessant, når vi skal gemme filens indhold i en variabel, så vi kan udnytte det. Alt du skal gøre er at oprette en variabel, for eksempel $Country , og give den filens indhold som dens værdi.

  • $Country = Get-Content «C:\TEMP\Pays txt»

Af ren nysgerrighed kan vi se på typen af ​​$Country- variablen efter at have tildelt den en værdi:

  • $Country.GetType()
Sådan administreres filer med Powershell
$Country.GetType()

Vi kan se, at vi får to relevante informationer : " Object[] " og " System.Array ". Vi har at gøre med et objekt i form af et array af værdier; det er interessant!

For at tælle antallet af elementer i denne tekstfil, kan vi gøre det på to forskellige måder:

  • $Pays.Count
  • ($Country | Måleobjekt).Count

Vi har 10 elementer, da det er en matrix; den første værdi svarer til indeks 0 og den sidste til indeks 9 (da vi kun har 10 elementer). Derfor vil værdien ved indeks 0 være "Frankrig", og værdien ved indeks 9 vil være Nicaragua.

Hvis du vil forespørge på værdien fundet ved indeks 0, det vil sige den første værdi, er det meget enkelt:

  • $ Land [0]

Eller hvis du foretrækker det, går det ud på at gøre:

  • (Hent indhold "C:\TEMP\Pays txt") [0]

På samme måde, for at hente den sidste værdi uden at kende det nøjagtige indeksnummer, er der et trick! Brug blot "-1" som nummer for indekset:

  • (Hent indhold "C:\TEMP\Pays txt") [-1]
"C:\TEMP\Pays txt") [-1]
«C:\TEMP\Pays txt») [-1]

I stedet for at hente filindholdet som et array, kan vi hente det som en enkelt streng. Du skal blot tilføje parameteren -Raw til kommandoen:

  • Get-Content -sti «C:\TEMP\Pays txt» -rå
Get-Content -sti "C:\TEMP\Pays txt" -raw
Get-Content -sti «C:\TEMP\Pays txt» -rå

Lad os fortsætte med nogle praktiske eksempler.

III. De halen af Linux på PowerShell-måde

I Linux er det meget almindeligt at bruge `tail` -kommandoen til at vise de sidste par linjer i en fil . Jeg bruger den ofte til at forespørge på en logfil, især fordi outputtet er dynamisk: hvis linjer tilføjes til filen, vil de blive vist i konsollen, efterhånden som den skrider frem.

Det er meget praktisk, og det er muligt at gøre det samme i PowerShell ved hjælp af Get-Content og en indstilling kaldet... -Tail og en anden indstilling -Wait !?

Uden -Wait-funktionen kan vi hente de sidste X linjer i en fil alene ved hjælp af -Tail. For eksempel, for at hente de sidste 5 linjer i vores Pays.txt-fil:

  • Hent-indhold «C:\TEMP\Pays txt» -Til 5

Hvis vi nu vil vise de sidste 5 linjer og vente med at hente fremtidige linjer tilføjet til filen, vil vi bruge denne syntaks:

  • Hent-indhold «C:\TEMP\Pays txt» -Tail 5 -vent

For at teste dette skal du køre kommandoen ovenfor og derefter ændre filen " Pays txt " for at tilføje en linje: du vil se den vist næsten i realtid i PowerShell-konsollen, hvor kommandoen udføres.

Faktisk holder `Get-Content` med `-Wait`- kommandoen filen åben og tjekker hvert sekund for nyt indhold. For at afslutte kommandoen skal du blot trykke på " CTRL + C ".

Du skal være opmærksom på, at du kan bruge indstillingen -Wait only : i dette tilfælde vil hele filen blive vist i konsollen og derefter forblive ventende.

  • Hent-indhold «C:\TEMP\Pays txt» -Vent

IV. Få de første X linjer i en fil

På samme måde kan vi hente de første par linjer i en fil. I dette tilfælde bruger vi ikke -Tail, men i stedet -TotalCount . Igen skal du angive antallet af linjer, der skal vises.

  • Hent-indhold «C:\TEMP\Pays txt» -TotalCount 5
  Komplet guide til kryptering af eksterne drev med VeraCrypt og BitLocker

På den anden side, og logisk set, er -Wait- indstillingen ikke nyttig sammen med -TotalCount- indstillingen.

Hent-indhold "C:\TEMP\Pays txt" -TotalCount 5
Hent-indhold «C:\TEMP\Pays txt» -TotalCount 5

V. NTFS: Se en sekvens hemmelighed i en fil

NTFS - filsystemet er unikt, idet det har forskellige " strømme ", hvori data kan lagres. Når data skrives til en fil, lagres de i $DATA-strømmen . Derfor læser vi indholdet af denne datastrøm, når vi tilgår filen.

Desuden kan vi se, at vores " Pays txt " -fil har dette flow takket være Get-Item-kommandoen:

  • Hent element "C:\TEMP\Pays txt" -Stream*

Vi bemærker også, at konsollen kun returnerer denne datastrøm.

C:\TEMP\Pays txt" -Stream *
C:\TEMP\Pays txt»-Stream*

Det fantastiske er, at du kan oprette din egen transmission for at skjule dataene indeni!

Alt du skal gøre er at tilføje data til vores " Pays.txt "-fil og angive den rækkefølge , dataene skal sendes i. Lad os for eksempel oprette " Creds " -flowet med værdien " Password ".

  • Tilføj-indhold - Sti «C:\TEMP\Pays txt» -Stream Creds -Værdi «Adgangskode»

Hvis vi nu viser listen over transmissioner i vores fil igen, får vi en ny post:

Tilføj-indhold -Sti "C:\TEMP\Pays txt" -Stream Creds -Værdi "Password"
Tilføj-indhold - Sti «C:\TEMP\Pays txt» -Stream Creds -Værdi «Adgangskode»

Hvis vi har det sjovt med at vise indholdet af vores fil, vil vi se, at "Password"-værdien, som jeg lige har tilføjet til filen, ikke vises.

  • Hent indhold "C:\TEMP\Pays txt"

Derudover kan du, for at forespørge standardstrømmen, angive dens navn efter -Stream- parameteren i Get-Content (vær opmærksom på syntaksen):

  • Get-Content «C:\TEMP\Pays txt» -Stream ':$DATA'

Hvis du vil vise indholdet af den "Creds" -strøm , vi oprettede tidligere, skal du blot sige dette:

  • Hent indhold "C:\TEMP\Pays txt" -Stream Creds

Kommandoen returnerer en enkelt værdi: Adgangskode

Beviset på billedet nedenfor:

Tilføj-indhold -Sti "C:\TEMP\Pays txt" -Stream Creds -Værdi "Password"

Det er godt at vide, men vi bør ikke tro, at det er en mirakelløsning til at skjule adgangskoder eller fortrolige data. Faktisk kan du scanne dit system med specifikke værktøjer eller Get-ChildItem for filer, der har en ekstra strøm ud over standard $DATA.

Det er en smule off topic, men for at udføre denne analyse fra en kørende mappe som udgangspunkt:

  • Get-ChildItem -Recurse | For hver{Get-Item$_. Fuldt navn -Strøm *} | Hvor -ne' transmitteres: $Data'

Denne kommando henter vores Pays.txt-fil og sender "Creds?". Det er meget sandsynligt, at Office-dokumenter også vil blive fremhævet af kommandoens output med en sekvens kaldet " Zone.Identifier ". Denne indeholder et ID, der giver systemet mulighed for at kende den zone, som denne fil tilhører ( intranet, internet osv. i modsætning til IE-zoner).

Du er måske interesseret i at læse om: Sådan retter du op på høj CPU-brug fra Searchindexer.exe

Konklusion

Som du kan se, er det sådan, du kan administrere dine filer med PowerShell. Ved at bruge instruktionerne i denne artikel kan du automatisere en række simple filhåndteringshandlinger på dine fillagringssystemer og spare tid, som du kan bruge på vigtigere opgaver. Vi håber, at disse oplysninger har været nyttige.