Vra

Die volgende kode gee my 'n verskeidenheid van PSCustomObjects, hoe kan ek dit kry om 'n verskeidenheid van Strings terugkeer?

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)}

(Soos 'n sekondêre vraag, wat is die psiscontainer deel vir? Ek gekopieer dat van 'n voorbeeld online)

Post-Aanvaar Edit: Twee groot antwoorde, wens ek kon albei van hulle merk. Het bekroon met die oorspronklike antwoord.

Was dit nuttig?

Oplossing

Jy hoef net te kies uit die eiendom wat jy wil uit die voorwerpe. FullName in hierdie geval.

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)} | foreach {$_.FullName}

Edit: Verklaring vir Mark, wat vra,

"Wat beteken die foreach doen Wat is dit deelinventaris oor?"

Sung Meister se verduideliking is baie goed, maar ek sal 'n stemming hier by te voeg, want dit nuttig kan wees.

Die sleutelbegrip is die pyplyn. Stel jou 'n reeks van tafeltennis balle afrol n smal buis een na die ander. Dit is die voorwerpe in die pyplyn. Elke stadium van pyplyn - die kode segmente geskei deur pyp (|) karakters - het 'n pyp gaan daarin en pyp uit te gaan van dit. Die uitset van 'n stadium is verbonde aan die insette van die volgende fase. Elke stadium neem die voorwerpe as hulle daar aankom, doen dinge vir hulle, en Hy laat hulle terug uit in die uitset pyplyn of stuur 'n nuwe, vervanging voorwerpe.

Get-ChildItem $directory -Recurse

get-ChildItem loop deur die lêerstelsel te skep FileSystemInfo voorwerpe wat elke lêer en gids dit ontmoetings verteenwoordig, en sit hulle in die pyplyn.

Select-Object FullName

Kies Objek neem elke FileSystemInfo voorwerp as dit kom, gryp die FULLNAME eiendom van dit (wat is 'n pad in hierdie geval), sit daardie eiendom in 'n splinternuwe persoonlike voorwerp dit geskep het, en sit dit op maat uit beswaar in die pyplyn.

Where-Object {!($_.psiscontainer)}

Dit is 'n filter. Dit neem elke voorwerp, ondersoek dit, en stuur dit terug uit of terug gooi dit na gelang van 'n paar toestand. Jou kode het hier 'n fout, by the way. Die persoonlike voorwerpe wat hier aankom het nie 'n psiscontainer eiendom. Hierdie stadium nie eintlik enigiets doen. Sung Meister se kode is beter.

foreach {$_.FullName}

foreach, wie se lang naam is foreach Objek, gryp elke voorwerp as dit kom, en hier, gryp die eiendom FULLNAME, 'n string, daaruit. Nou, hier is die subtiele deel: Enige waarde wat nie verbruik word, dit is, is nie vasgevang word deur 'n veranderlike of onderdruk in een of ander manier, is in die uitset pyplyn sit. As 'n eksperiment, probeer vervang daardie stadium met hierdie:

foreach {'hello'; $_.FullName; 1; 2; 3}

Eintlik probeer dit uit en kyk na die uitset. Daar is vier waardes in wat-kode blok. Nie een van hulle omgekom het. Let daarop dat hulle al verskyn in die uitset. Nou probeer om hierdie:

foreach {'hello'; $_.FullName; $ x = 1; 2; 3}

Let daarop dat een van die waardes word gevang deur 'n veranderlike. Dit lyk nie in die uitset pyplyn.

Ander wenke

Om die string te kry vir die lêernaam wat jy kan gebruik

$files = Get-ChildItem $directory -Recurse | Where-Object {!($_.psiscontainer)} | Select-Object -ExpandProperty FullName

Die -ExpandProperty parameter kan jy terug te kry 'n voorwerp wat gebaseer is op die tipe van die eiendom vermeld.

Verdere toetsing toon dat dit nie werk met V1, maar dat funksie is vasgestel as van die V2 CTP3.

Vir Vraag # 1

Ek het "kies-voorwerp" gedeelte verwyder - dit is oorbodig en verskuif "waar" filter voor "foreach" in teenstelling met antwoord dangph se - Filter so gou as moontlik sodat jy te doen het met net 'n subset van wat jy te doen het met in die volgende pyplyn.

$files = Get-ChildItem $directory -Recurse | Where-Object {!$_.PsIsContainer} | foreach {$_.FullName}

Dit kode uit in wese lees

  • Kry al die lêers volledige pad van al die lêers rekursief (Kry-ChildItem $ gids -Recurse)
  • Filter dopgehou (Waar Objek {! $ _. PsIsContainer})
  • Wys slegs volle lêernaam (foreach {$ _. FULLNAME})
  • 'Hou al lêername in $ lêers

Let daarop dat vir foreach {$ _. FULLNAME} , in Powershell, laaste stelling in 'n script blok ({...}) teruggestuur, in hierdie geval $ _. FULLNAME van tipe string

As jy regtig nodig het om 'n rou voorwerp te kry, het jy nie nodig om iets te doen na die verwydering van "kies-voorwerp". As jy was om te Select-Object gebruik, maar wil om toegang te verkry rou voorwerp, gebruik "PsBase", wat 'n heel ander vraag (onderwerp) - Verwys na " What's up met pSBASE, pSEXTENDED, pSADAPTED, en PSOBJECT? "vir meer inligting oor die onderwerp

Vir Vraag # 2

En ook filter deur $ _ PsIsContainer beteken dat jy uitgesluit 'n houer vlak voorwerpe -. In jou geval, jy doen get-ChildItem op 'n File System verskaffer (jy kan PowerShell verskaffers sien deurkom-PsProvider), so die houer is 'n DirectoryInfo (gids)

PsIsContainer beteken verskillende dinge in verskillende PowerShell verskaffers; bv) Vir Register verskaffer, PsIsContainer is van tipe Microsoft.Win32.RegistryKey Probeer hierdie:

>pushd HKLM:\SOFTWARE
>ls | gm

[UPDATE] om volgende vraag: Wat beteken die foreach doen? Wat is dit deelinventaris oor? Om te verduidelik, "foreach" is 'n alias vir "foreach-Object" Jy kan deur uit te vind,

get-help foreach

- of -

get-alias foreach

Nou in my antwoord, "foreach" is deelinventaris elke beswaar geval van tipe File Info teruggekeer van vorige pyp (wat dopgehou het gefiltreer). File Info het 'n eiendom genoem FULLNAME en dit is wat "foreach" is deelinventaris oor.
En jy verwys voorwerp deurgegaan pyplyn deur 'n spesiale pyplyn veranderlike genaamd "$ _" wat is van tipe File Info binne die script blok konteks van "foreach".

Vir V1, voeg die volgende filter om jou profiel:

filter Get-PropertyValue([string]$name) { $_.$name }

Dan kan jy dit doen:

gci . -r | ?{!$_.psiscontainer} | Get-PropertyName fullname

BTW, as jy gebruik maak van die PowerShell Gemeenskap Uitbreidings jy dit reeds het.

Met betrekking tot die vermoë om te kies Objek -Expand in V2 gebruik, dit is 'n oulike truuk maar nie voor die hand liggend en werklik is nie wat Select-Object nie -Expand is bedoel vir. -Expand is alles oor plat te slaan soos LINQ se SelectMany en Kies Objek is oor projeksie van verskeie eiendomme op 'n persoonlike voorwerp.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top