Testare nel codice PowerShell se una cartella è un punto di giunzione?
-
22-09-2019 - |
Domanda
Come posso verificare nel codice PowerShell se una cartella è un punto di giunzione?
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 .NetSystem.IO.FileAttributes.ReparsePoint
valore 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.")
}