Domanda

Come posso verificare nel codice PowerShell se una cartella è un punto di giunzione?

È stato utile?

Soluzione

Dai un'occhiata a questo blog:http://blogs.msdn.com/powershell/archive/2010/02/10/viewing-connections-with-dir.aspx

il modo per farlo è copiare il file di formattazione del file system integrato, modificarlo in modo che siano indicate le giunzioni, quindi caricarlo con Aggiornamento-FormatData:

Dal blog:

Le regole di formattazione del file system sono in $pshome\FileSystem.Format.ps1xml.IO... copiato questo, poi nell'elemento [ViewDefinitions –> View –> TableControl –> TableRowEntries –> TableRowEntry –> TableColumnItems –> TableColumnItem] Ho cambiato il contenuto di Nome della proprietà con valore di 'Modè al seguente punto:

<ScriptBlock> 
   "$($_.Mode)$(if($_.Attributes -band [IO.FileAttributes]::ReparsePoint)
{'J'})" </ScriptBlock> 

Questo fa un bitwise AND sul Attributi dell'oggetto DirectoryInfo proprietà ($_.Attributes) contro la .Net System.IO.FileAttributes.ReparsePointvalore enum.Se il risultato non è zero, visualizza una «J» accanto all'altra attributi di modalità file.Poi, caricare il nuovo file di formattazione come questo:

 PS> Update-FormatData -PrependPath myFilesystem.format.ps1xml

IL PrependPath parametro assicura che viene caricato il nuovo file di formattazione prima dei file di formattazione incorporati.

Directory alink ha una «J» nella modalità colonna, sembra funzionare!

Si trova nella colonna Mode J per Giunzione.

Altri suggerimenti

Se (Get-Item cartella di prova ). Attributes.ToString (). Contiene ( "ReparsePoint") { Codice }

Dal momento che almeno v5.0 PowerShell, non v'è un migliore supporto per i collegamenti (o come li chiama MS: punti di analisi)

migliorate cmdlet Item - LINKTYPE immobili

articolo collegato è sotto WMF 5,0 categoria, il che potrebbe significare che il metodo era disponibile dal PS v5.0.
Queste caratteristiche sono state incluse nella serie Get-Item, Get-ChildItem, quindi non ci sono passaggi aggiuntivi richiesti. Può essere utilizzato su qualsiasi PS corrente.

LINKTYPE è una proprietà stringa su un oggetto, restituito da Get-Item e Get-ChildItem,
può avere uno dei seguenti quattro valori: '', 'Junction', 'SymbolicLink', 'HardLink'.

Per rispondere alla domanda di OP, è possibile controllare se una cartella è un punto di giunzione utilizzando:

if ((Get-Item -Path $Target -Force).LinkType -eq "Junction") { }

Per verificare se un file / cartella è un "ReparsePoint", di qualsiasi tipo (Junction, SymbolicLink o HardLink):

if ((Get-Item -Path $Target -Force).LinkType) { }

valore LINKTYPE sul file ordinario / cartella è una stringa vuota, che se usato come se condizione in PS si risolve False


Get-ChildItem può essere utilizzato per elencare tutte le cartelle di giunzione:

(Get-ChildItem -Path $Target -Force) | Where-Object { $_.LinkType -eq "Junction" }

Si noti che il valore 'SymbolicLink' è lo stesso per entrambi file o una cartella, quindi alla lista solo i link simbolici alle cartelle:

(Get-ChildItem -Path $Target -Directory -Force) | Where-Object { $_.LinkType -eq "SymbolicLink" }


Cmdlet Get-ChildItem (alias: dir, ls, gci) ora mostra attributo ReparsePoint, come l nella colonna Modalità, senza alcuna estensione. Ma non mostrerà 'HardLink' e mostra l sia per Junction e SymbolicLink:

> Get-ChildItem -Path $Target -Force


    Directory: C:\Users


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d--hsl       2018-04-12     01:45                All Users                     
d-rh--       2018-05-09     06:12                Default                       
d--hsl       2018-04-12     01:45                Default User                  
d-----       2018-06-24     03:05                Papo                          
d-r---       2018-07-27     07:12                Public
  • LINKTYPE non funziona su cartelle con permessi speciali all'interno \ Utenti e \ Utenti \, anche se Get-ChildItem come visto sopra funziona e mostra l su di loro.
  • Remove-Item ha problemi. Esso non può rimuovere Junction, e se forzata, rimuoverà i contenuti originali con esso. Questo è detto di essere risolto in futuro v6 versione PS

L'utilizzo di questi migliorati, o Cmdlet standard di oggi, ha alcuni vantaggi rispetto ai metodi precedenti, descritti in risposte più anziani qui.

  • Non distinguere tra Junction e collegamento simbolico
    Se OP ha voluto testare se la cartella è un Junction, controllando dalla proprietà attributo si tradurrebbe in falso positivo per la cartella collegamento simbolico.

  • rileva hard link.

  • LINKTYPE è [String] invece di Attributi proprietà, che è [FileAttributes] tipo e previa .ToString () o l'uso di -Band

A proposito, se vi capita di essere in esecuzione le estensioni PowerShell Comunità , questa informazione è disponibile come uscita (e come una proprietà nota) in uscita di Get-ChildItem:

21> gci .\Roaming\Microsoft\eHome


    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Users...


Mode           LastWriteTime       Length Name
----           -------------       ------ ----
d----     2/15/2010 12:18 AM        <DIR> DvdCoverCache
d----      8/9/2009  1:10 AM    <SYMLINK> DvdInfoCache [\...
d----      8/8/2009 11:51 PM        <DIR> DvdInfoCache.orig
d----    10/22/2009  7:12 PM        <DIR> mcl_images

Tuttavia, per l'accesso programmatico avrei accedere alla informazioni tramite la proprietà attributi come suggerisce l'altro manifesto.

Se si hanno le estensioni di PowerShell comunitari che consiglierei se si sta lavorando con giunzioni è possibile effettuare le seguenti operazioni per determinare se una cartella è un incrocio o no:

Import-Module pscx
if ((Get-Item *test_folder*).ReparsePoint){
    Write-Host "YES"
}

Prova questo:

$TargetAttributes = (Get-Item -Path $Target -Force).Attributes.ToString()
if ($TargetAttributes -match "ReparsePoint") {
    if ($TargetAttributes -match "Archive") {
        Write-Output ("Link to a file.")
    } else {
        Write-Output ("Link to a folder.")
    }
} else {
    Write-Output ("Normal File or Folder.")
}    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top