Frage

Wie kann ich im PowerShell -Code testen, wenn ein Ordner ein Anschlusspunkt ist?

War es hilfreich?

Lösung

Schauen Sie sich diesen Blog an:http://blogs.msdn.com/powershell/archive/2010/02/10/viewing-junctions-with-dir.aspx

Die Möglichkeit, dies zu tun Update-Formatdata:

Von dem Blog:

Die Dateisystem -Formatierungsregeln sind in $pshome\FileSystem.Format.ps1xml. Ich habe das kopiert, dann im Element [ViewDefinitions –> View –> TableControl –> TableRowEntries –> TableRowEntry –> TableColumnItems –> TableColumnItem]Ich habe den Inhalt von geändert Name des Anwesens mit Wert des 'Modus' zu Folgendem:

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

Dies macht eine bitweise und auf der Eigenschaft DirectoryInfo -Objektattribute (Eigenschaft ($_.Attributes) gegen den .net System.IO.FileAttributes.ReparsePointUmlaufwert. Wenn das Ergebnis nicht Null ist, wird neben den anderen Dateimodusattributen ein 'J' angezeigt. Laden Sie als Nächstes die neue Formatierungsdatei wie folgt:

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

Das Vorpath Der Parameter stellt sicher, dass die neue Formatierungsdatei vor den integrierten Formatierungsdateien geladen wird.

Das Verzeichnis Alink hat in der Spalte Mode ein 'J', scheint zu funktionieren!

Es befindet sich in der Modus -Spalte J für Junction.

Andere Tipps

If (Get-item Testordner) .Attributes.toString (). Enthält ("Reparsepoint") {{Code}

Da mindestens PowerShell v5.0, gibt es bessere Unterstützung für Links (oder wie MS sie nennt: Reparaturpunkte).

Verbessertes Artikel cmdlets - LinkType Eigentum

Der verknüpfte Artikel befindet sich in der Kategorie WMF 5.0, was bedeuten könnte, dass die Methode seit PS v5.0 verfügbar war.
Diese Funktionen wurden in Standard-Get-Item, Get-Childitem enthalten, sodass keine zusätzlichen Schritte erforderlich sind. Es kann auf jedem aktuellen PS verwendet werden.

LinkType ist eine Zeichenfolgeneigenschaft für ein Objekt, die von GET-ITEM und GET-CHILDITEM zurückgegeben wird.
Es kann einen der folgenden vier Werte haben: "," Junction "," SymbolicLink "," Hardlink ".

Um die Frage von OP zu beantworten, können Sie überprüfen, ob ein Ordner ein Anschlusspunkt mit:

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

So überprüfen Sie, ob eine Datei/ein Ordner ein "Reparsepoint" ist, jeglicher Art (Junction, SymbolLink oder Hardlink):

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

Der LinkType -Wert in der gewöhnlichen Datei/des Ordners ist eine leere Zeichenfolge, die bei Verwendung als verwendet wird wenn Die Bedingung in PS beschließt zu falsch


Get-childitem kann verwendet werden, um alle Anschlussordner aufzulisten:

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

Beachten Sie, dass der Wert 'SymbolicLink' sowohl für Datei als auch für den Ordner gleich ist. Auflisten nur symbolische Links zu Ordnern:

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


Cmdlet get-childitem (alias: dir, ls, gci) zeigt jetzt Reparsepoint-Attribut als l In der Modusspalte ohne Erweiterung. Aber es wird nicht 'Hardlink' und Shows zeigen l sowohl für Junction als auch für 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 funktioniert nicht auf Ordnern mit speziellen Berechtigungen in user und user , obwohl Get-Childitem wie oben gezeigt funktioniert und zeigt l auf sie.
  • Entfernen-item hat Probleme. Es kann keine Kreuzung entfernen und wird bei erzwungener ursprünglicher Inhalt damit entfernt. Dies soll in der zukünftigen Version PS v6 behoben werden

Die Verwendung dieser verbesserten oder heutigen Standard -CMDLets hat einige Vorteile gegenüber früheren Methoden, die hier in älteren Antworten beschrieben werden.

  • Es unterscheidet zwischen Übergang und symbolischer Verbindung
    Wenn OP testen wollte, ob ein Ordner eine Übermittlung ist, würde die Überprüfung der Attributeigenschaft zu einem falsch positiven symbolischen Link zum Ordner führen.

  • Erkennt harte Link.

  • LinkTyPe ist [String] im Gegensatz zur Eigenschaftseigenschaft, nämlich Typ und Bedürfnisse .ToString () oder eine Verwendung von -band

Zu Ihrer Information, wenn Sie zufällig laufen Powershell Community Extensions, Diese Informationen sind als Ausgabe (und als Note-Eigenschaft) zur Ausgabe von Get-childitem verfügbar:

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

Für den programmatischen Zugriff würde ich jedoch über die Eigenschaft von Attributen auf die Informationen zugreifen, wie das andere Poster vorschlägt.

Wenn Sie die PowerShell -Community -Erweiterungen haben, die ich empfehlen würde, wenn Sie mit Kreuzungen arbeiten, können Sie Folgendes tun, um festzustellen, ob ein Ordner eine Kreuzung ist oder nicht:

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

Versuche dies:

$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.")
}    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top