Hur man hanterar filer med Powershell

Senaste uppdateringen: 04/10/2024
Författare: Javier Chirinos
Hur man hanterar filer med Powershell

Varje dag måste systemadministratörer utföra flera standardoperationer på de många filerna och mapparna på sina servrar. Windows. Dessa uppgifter innebär ofta att hantera användardata på delade resurser och säkerställa korrekta säkerhetskopior. För att minska mängden manuellt arbete som detta representerar kan du använda Power.

I den här artikeln kommer du att lära dig hur du använder PowerShell för att:

  • Visa objekt i en katalog
  • Skapa filer och mappar
  • Ta bort filer och mappar
  • Kopiera filer och mappar
  • Flytta filer eller kataloger
  • Byt namn på filer
  • Ändra filtillägg
  • Och mycket mer

Innan du börjar, se till att din systempolicy tillåter dig att köra PowerShell-skript.

Visa objekt i en katalog

För att se innehållet i en katalog på en Windows-filserver, använd Get-ChildItem cmdlet. För att visa alla dolda filer, lägg till parametern -Force. Följande kommando visar alla rotobjekt i mappen "Delad".

Här kan du lära dig om: Fix: Uppdateringen är inte tillämplig på din enhet

  • Get-ChildItem -Force \\ fs \ Shared

Om du också vill se alla undermappar och deras innehåll, lägg till parametern -Recurse:

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

För att filtrera resultaten, lägg till parametrarna Filtrera, Exkludera, Inkludera och Sökväg till cmdleten Get-ChildItem. För avancerad objektfiltrering, använd Where-Object cmdlet. Sekvensen av kommandon nedan och hitta alla körbara filer i IT-arkivet som har ändrats efter den 1 april 2018.

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

Skapa filer och mappar med PowerShell

För att skapa nya objekt med Windows PowerShell kan du använda New-Item cmdlet och ange vilken typ av objekt du vill skapa, till exempel en katalog, fil eller registernyckel.

Detta kommando skapar till exempel en mapp:

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

Och detta skapar en tom fil:

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

Skapa filer och skriv data till dem

Det finns minst två inbyggda metoder för att skapa en fil och skriva data till den. Den första är att använda Ut-fil cmdlet:

  • $text = 'Hej världen!' | Utdatafil $text-FilePath C:\data\text.txt

För att skriva över en befintlig fil, använd parametern switch –Force. Du kan också skapa filer med Export-Csv-cmdleten, som exporterar resultatet till en csv-fil som kan öppnas i Excel:

  • Get-ADuse -Filter * | Export-Csv -Sökväg C:\data\ADusars.csv

Skapa filer efter att ha verifierat att de inte redan finns

följande skript kontrollerar om en specifik fil (pctxt) redan finns i en viss mapp. Om filen inte redan finns genererar skriptet en lista över alla AD-datorer och sparar den i en ny fil som heter pctxt:

# skapar en serie textfiler

$files = Get-ChildItem C:\data\*. txt | välj -expandera fullständigt namn

# kontrollera om filen finns i strängen

$files -match "pc.txt"

# om matchningen returnerar "True", avsluta, om den returnerar "False", skapa en rapport

if ($files -eq 'False') {

Get-ADComputer -Filter * | Export-Csv -Sökväg C:\data\pc.txt

}

mer {exit}

Ta bort filer och mappar med PowerShell

För att ta bort objekt, använd Remove-Item-cmdleten. Du bör komma ihåg att du kommer att bli tillfrågad om bekräftelse vid körning om objektet inte är tomt. Följande exempel visar hur man tar bort IT-mappen, alla dess undermappar och filerna som den innehåller:

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

bekräfta

Elementet i \\ pdc \ shared \ har barn och parametern Recurse specificerades inte. Om du fortsätter kommer alla barn att tas bort med elementet.

Är du säker på att du vill fortsätta?

[Y] Ja [A] Ja till alla [N] Nej [L] Nej till alla [S] Suspendera [?] Hjälp

(standard är "Y"):

Om du redan har verifierat att alla objekt i en mapp ska raderas, kan du använda omkopplaren? Fallback för att hoppa över bekräftelsesteget:

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

Ta bort filer och mappar äldre än X dagar

Ibland är det nödvändigt att rensa gamla filer från en viss katalog. Så här gör du den här uppgiften:

$Folder = "C:\Backups"

#remove filer äldre än 30 dagar

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

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

ForEach-Object {

$_ | -Tvinga

$_. Fullständigt namn | Utdatafil C:\log\deletedbackups.txt -Lägg till

  OS/2 för Mach 20: fiaskot som präglade Microsoft och OS/2:s långa väg fram till idag

}

Ta bort filer efter att ha verifierat att de finns

Så här verifierar du att en fil finns och tar bort den om den finns:

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

If (Test-Path $FileName) {

   Ta bort elementet $FileName

}

Ta bort filer på flera datorer med ett enda skript

För att radera filer på fjärrdatorer måste du ha säkerhetsbehörighet för att komma åt dem. Se till att du använder UNC-sökvägar så att skriptet korrekt bestämmer platsen för filerna.

$filelist = @(«\c$\Temp», «\c$\Backups») # variabel för att radera filer och mappar

$computerlist = Get-Content C:\data\pc.txt # hämta lista över fjärrdatorer

    foreach ($computer i $listan över datorer) {

        foreach ($file i $filelist) {

            $ filsökväg = Gå med-sökväg «\\ $dator \» «$ fillista» # generera unc-sökvägar till filer och mappar

            if (testväg $filsökväg)

            {

            Ta bort element $filepath -force -recurse -ErrorAction Fortsätt}}}

Kopiera filer och mappar med PowerShell

El Copy-Item cmdlet låter dig kopiera objekt från en väg till en annan. Följande kommando skapar en säkerhetskopia genom att kopiera filenusas.xlsx från en fjärrdator (fs) och spara den till en annan (fs2) över nätverket:

  • Kopiera objekt -Path\\ fs\Shared\it\usas.xlsx -Destination\\ fs2\Backups\it\usas.xlsx

Om målfilen redan finns kommer kopieringsförsöket att misslyckas. För att skriva över den befintliga filen, även om den är skrivskyddad, använd parametern -Force.

  • Kopiera objekt -Path\\ fs\Shared\it\usas.xlsx -Destination\\ fs2\Backups\it\usas.xlsx -Force

Kopiera filer med PowerShell till eller från en fjärrdator

Om du kopierar filer till eller från fjärrdatorer, se till att använda UNC-sökvägar.

T.ex., använd det här kommandot för att kopiera filer från en fjärrfilserver till den lokala C:-katalogen:

  • Kopiera element \\ fs \ c $ \ temp -Rekurs C: \ data \

För att kopiera filer från din lokala katalog till fjärrmappen, vänd helt enkelt om käll- och destinationsplatserna:

  • Kopiera objekt C:\data\-Recurse\\fs\c$\temp

Kopiera flera filer från en server till en annan över nätverket med ett skript

Du kan också kopiera filer från en fjärrserver till en annan. Följande skript kopierar mappen rekursivt \\ fs \ Shared \ temp i \\ fs \ Shared \ test:

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

Kopiera endast vissa typer av filer

För att bara kopiera vissa filer från källan till destinationen, använd parametern -Filter. Till exempel kopierar följande kommando bara txt-filer från en mapp till en annan:

  • Kopiera element -Filter *.txt -Sökväg \\ fs \ Shared \ it -Recurse -Destination \\ fs2 \ Shared \ text

Kopiera filer med XCOPY- och ROBOCOPY-kommandon eller COM-objekt

Du kan också köra kommandona XCOPY och ROBOCOPY för att kopiera filer eller använda COM-objekt, som i följande exempel:

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

Flytta filer och kataloger med PowerShell

El Flytta objekt cmdlet flyttar ett element, tillsammans med dess egenskaper, innehåll och underordnade, från en plats till en annan. Du kan också flytta en fil eller underkatalog från en katalog till en annan plats.

Följande kommando flyttar en specifik säkerhetskopia från en plats till en annan:

  • Move-Item -Path \\ fs \ Shared \ Backups \ 1.bak -Destination \\ fs2 \ Backups \ archive \ 1.bak

Det här skriptet flyttar hela mappen Backups och dess innehåll till en annan plats:

  • Move-Item -Path \\ fs \ Shared \ Backups -Destination \\ fs2 \ Backups \ archive

Säkerhetskopieringskatalogen och alla dess filer och undermappar kommer att visas i arkivkatalogen.

Byt namn på filer med Powershell

El Byt namn på objekt-cmdlet låter dig ändra namnet på ett objekt utan att röra dess innehåll. Det är inte möjligt att flytta element med kommandot Byt namn på element. För att göra detta måste du använda Move-Item cmdleten, som förklarats ovan.

Följande kommando byter namn på en fil:

  • Byt namn på element -Sökväg «\\ fs \Shared \temp.txt» -NewName «new_temp.txt»

Byt namn på flera filer

För att byta namn på flera filer samtidigt, använd ett skript så här:

$files = Get-ChildItem -Path C:\Temp #skapa lista med filer

foreach ($file i $files)

{

    $newFileName = $file.Name.Replace("A", "B") #ersätt "A" med "B"

    Byt namn på elementet $file $newFileName

}

Redigera filtillägg med PowerShell

Du kan också använda Byt namn på objekt för att ändra filtillägg. Om du vill ändra filtilläggen för flera filer samtidigt, använd Byt namn på objekt-cmdlet med Get-ChildItem cmdlet.

Följande skript ändrar alla filtillägg från "txt" till "bak". Jokertecknet (*) används för att inkludera alla textfiler:

  • Get-ChildItem \\ fs \ Shared \ Loggar \ *. Text | Byt namn på objekt -Nytt namn {$_. Namn - Ersätt '\.txt$', '. Bak'}
  Hur man skapar en innehållsförteckning i Indesign

Get-Content - Hur läser man innehållet i en fil i PowerShell?

Get-Content-cmdleten är ett av de kommandon du måste ha när du analyserar PowerShell-skript. Det låter dig läsa innehållet i en fil i PowerShell, vilket är en mycket vanlig åtgärd. Förutom att läsa data kan vi importera data till en variabel att använda i PowerShell-skriptet. Du kan använda Get-Content för att hämta innehållet i en loggfil, till exempel.

Vi får se det Get-Content är en kraftfull cmdlet som kan göra mer än att bara återställa innehållet i en fil i sin helhet, därav intresset av att dedikera en hel artikel till den. Denna cmdlet fungerar på Windows Powershell 5.1 och PowerShell, inklusive den senaste versionen hittills: PowerShell 7.1.1.

II. Läs bara innehållet i en fil

För att börja, helt enkelt vi kommer att läsa innehållet i en textfil som kommer att innehålla en lista med värden. För att följa den här delen av handledningen inbjuder vi dig att skapa en fil som heter » Paystxt » och förvara den i » C:\TEMP«. Den här filen måste ha följande innehåll:

  • Frankrike
  • Costa Rica
  • Belgien
  • swiss
  • Spanien
  • Colombia
  • Kanada
  • Brasil
  • Island
  • Nicaragua

Steg för att läsa innehållet i Powershell

  1. steg 1: För att läsa och visa innehållet i den här filen i konsolen är kommandot superenkelt eftersom du bara behöver ange namnet på filen (eller hela sökvägen om den inte finns i den aktuella katalogen):
  2. steg 2: Du får innehållet «C:\TEMP\Pays txt»
C:\TEMP\Pays txt
C:\TEMP\Pays txt
  1. steg 3: Parametern -Väg kommer att användas implicit för detta värde. Om vi ​​skriver kommandot nedan är det samma.
    1. Get-Content -Path «C:\TEMP\Pays txt»

OBSERVERA: Att visa innehåll i konsolen hjälper inte mycket. Det är mer intressant när vi ska lagra innehållet i filen i en variabel för att kunna utnyttja den. Allt du behöver göra är att skapa en variabel, t.ex. $Country , och ge det innehållet i filen som ett värde:

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

Av nyfikenhet kan vi titta på typen av variabel $Country efter att ha tilldelat ett värde:

  • $Country.GetType()
Hur man hanterar filer med Powershell
$Country.GetType()

Vi kan se att vi får två bitar av relevant information: » Objekt[] "Y" System.Array «. Vi har att göra med ett objekt i form av en rad värden; Det är intressant!

För att räkna antalet element i denna textfil kan vi göra det på två olika sätt:

  • $Pays.Count
  • ($Country | Mätobjekt).Count

Vi har 10 element, eftersom det är det en array motsvarar det första värdet index 0 och det sista index 9 (eftersom vi bara har 10 element). Därför kommer värdet på index 0 att vara "Frankrike" och värdet för index 9 kommer att vara Nicaragua.

Om du vill fråga värdet som finns vid index 0, det vill säga det första värdet, är det väldigt enkelt:

  • $ Land [0]

Eller om du föredrar, det handlar om att göra:

  • (Hämta innehåll "C:\TEMP\Pays txt") [0]

På samma sätt, för att hämta det sista värdet utan att veta det exakta indexnumret, finns det ett knep! Använd bara "-1" som nummer för indexet:

  • (Hämta innehåll "C:\TEMP\Pays txt") [-1]
"C:\TEMP\Pays txt") [-1]
«C:\TEMP\Pays txt») [-1]

Istället för att hämta innehållet i filen i form av en array kan vi hämta den som en enda sträng. Lägg bara till parametern -Rå att ge order:

  • Get-Content -sökväg «C:\TEMP\Pays txt» -rå
Get-Content -sökväg "C:\TEMP\Pays txt" -rå
Get-Content -sökväg «C:\TEMP\Pays txt» -rå

Låt oss fortsätta med några praktiska exempel.

III. De svans av Linux på PowerShell-sätt

En Linux, är det mycket vanligt att använda Comando svans för att visa de sista raderna i en fil. Jag använder den ofta för att fråga efter en loggfil, speciellt eftersom utdata är dynamiskt - om rader läggs till i filen kommer de att visas i konsolen när du går.

Det är väldigt praktiskt och det är möjligt att göra samma sak i PowerShell med hjälp av Get-Content och ett alternativ som heter... -Svans och ett andra alternativ -Vänta ! ?

Utan alternativet -Vänta kan vi hämta de sista X raderna i en fil med enbart -Tail. Till exempel, för att hämta de sista 5 raderna i vår Pays txt-fil:

  • Get-Content «C:\TEMP\Pays txt» -Svans 5

Om vi ​​nu vill visa de sista 5 raderna och vänta på att hämta framtida rader som lagts till filen, kommer vi att använda denna syntax:

  • Get-Content «C:\TEMP\Pays txt» -Svans 5 -vänta
  Komplett guide om SysRq Key i Linux

För att testa, kör kommandot ovan och ändra sedan filen » Betalar txt » för att lägga till en rad: du kommer att se det visas nästan i realtid i PowerShell-konsolen där kommandot körs.

Faktiskt med kommandot -Vänta , Get-Content Den håller filen öppen och kontrollerar varje sekund efter nytt innehåll som ska visas. För att slutföra att utföra kommandot är det väldigt enkelt, utför bara en «CTRL + C".

Du måste tänka på att det kan använd alternativet -Vänta endast- I det här fallet kommer hela filen att visas i konsolen och förblir sedan väntande.

  • Get-Content «C:\TEMP\Pays txt» -Vänta

IV. Hämta de första X raderna i en fil

I samma anda kan vi återställa de första raderna i en fil. I det här fallet kommer vi inte att använda -Tail men -TotalCount en su plats. Här måste du återigen ange antalet rader som ska visas.

  • Get-Content «C:\TEMP\Pays txt» -TotalCount 5

Å andra sidan, och det är logiskt, det -Vänta alternativet är inte användbart med -TotalCount alternativ.

Get-Content "C:\TEMP\Pays txt" -TotalCount 5
Get-Content «C:\TEMP\Pays txt» -TotalCount 5

V. NTFS: Se en sekvens hemlighet i en fil

Filen NTFS Systemet har skillnaden att ha olika » flöden » för att lagra data. När data skrivs till en fil, lagras i $DATA-strömmen. Så när vi frågar filen kommer vi att läsa innehållet i denna dataström.

Dessutom kan vi se att vår fil » Betalar txt » har detta flöde tack vare kommandot Get-Item:

  • Hämta elementet "C:\TEMP\Pays txt" -Stream*

Vi märker också att konsolen endast returnerar denna dataström.

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

Det som är bra är att du kan skapa din egen överföring att dölja data inuti! ?

Allt du behöver göra är att lägga till data i vår fil » Betalar txt «, med angivande av sekvens där data ska skickas. Låt oss till exempel skapa flöde » Cred » med värde » lösenord".

  • Add-Content -Path «C:\TEMP\Pays txt» -Stream Creds -Value «Lösenord»

Nu, om vi visar listan över transmissioner i vår fil igen får vi en ny post:

Add-Content -Sökväg "C:\TEMP\Pays txt" -Stream Creds -Värde "Lösenord"
Add-Content -Path «C:\TEMP\Pays txt» -Stream Creds -Value «Lösenord»

Om vi ​​har roligt med att visa innehållet i vår fil kommer vi att se att värdet "Password" som jag precis lade till i filen inte visas.

  • Hämta innehåll "C:\TEMP\Pays txt"

För att fråga standardflödet kan du dessutom ange dess namn efter parametern -Strömma från Get-Content (var uppmärksam på syntaxen):

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

Om du vill visa innehållet i överföring "Creds" som vi skapade ovan, säg bara att:

  • Hämta innehåll "C:\TEMP\Pays txt" -Stream Creds

Kommandot returnerar ett enda värde: lösenord

Beviset på bilden nedan:

Add-Content -Sökväg "C:\TEMP\Pays txt" -Stream Creds -Värde "Lösenord"

Det är bra att veta, men vi ska inte säga till oss själva att det är mirakellösningen för att dölja lösenord eller konfidentiell data. Faktum är att man kan skanna systemet med specifika verktyg eller Get-ChildItem letar efter filer som har en flöde utöver standard $DATA.

Det är lite utanför ämnet, men för att utföra denna analys från en löpande mapp som utgångspunkt:

  • Get-ChildItem -Recurse | För varje{Get-Item$_. Fullständigt namn -Ström *} | Där -ne' sänds: $Data'

Detta kommando ger vår Pays txt-fil och kommer att sända "Creds?" Det är mycket möjligt att Office-dokument också markeras av kommandot utdata med a sekvens heter » Zon.Identifierare «. Den innehåller ett ID som gör att systemet kan veta vilken zon den här filen tillhör (intranät, internet, etc., gentemot IE-zoner).

Du kanske är intresserad av att läsa om: Hur man fixar Searchindexer.exe Hög CPU-användning

Slutsats

Som du kan se är det så här du kan hantera dina filer med Powershell. Genom att använda instruktionerna i den här artikeln kan du automatisera en mängd enkla operationer relaterade till filhantering på dina operativsystem. lagring filer och spara tid som du kan lägga på viktigare uppgifter. Vi hoppas att vi har hjälpt dig med denna information.