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.
$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.
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
- 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):
- trin 2: Du får indholdet «C:\TEMP\Pays txt»
- trin 3: Parameteren -Sti vil blive brugt implicit for denne værdi. Hvis vi skriver kommandoen nedenfor, er den den samme.
- 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()
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]
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å
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
På den anden side, og logisk set, er -Wait- indstillingen ikke nyttig sammen med -TotalCount- indstillingen.
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.
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:
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:

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.
Mit navn er Javier Chirinos, og jeg brænder for teknologi. Så længe jeg kan huske, var jeg glad for computere og videospil, og den hobby endte i et job.
Jeg har udgivet om teknologi og gadgets på internettet i mere end 15 år, især i mundobytes.com
Jeg er desuden ekspert i online kommunikation og markedsføring og har kendskab til WordPress udvikling.
Index
- 1 Vis objekter i en mappe
- 2 Opret filer og mapper med PowerShell
- 3 Slet filer og mapper med PowerShell
- 4 Kopier filer og mapper med PowerShell
- 5 Flyt filer og mapper med PowerShell
- 6 Omdøb filer med Powershell
- 7 Rediger filtypenavne med PowerShell
- 8 Get-Content - Hvordan læser man indholdet af en fil i PowerShell?
- 9 Konklusion