Das Ausführen von Get-ChildItem auf dem UNC-Pfad funktioniert in Powershell, nicht jedoch in Powershell in einer Batch-Datei
Schreibe ich eine batch-Datei, führt ein Powershell-Skript an einer Stelle Schleifen Einzelteile mit UNC-Pfaden als Attribute und verwendet Get-ChildItem
auf diesen Pfaden. In einer minimalen version, das ist das, was in meinen Skripten:
Master.bat
powershell -ExecutionPolicy ByPass -File "Slave.ps1"
Slave.ps1
$foo = @{Name = "Foo"}
$foo.Path = "\\remote-server\foothing"
$bar = @{Name = "Bar"}
$bar.Path = "\\remote-server\barthing"
@( $foo, $bar ) | ForEach-Object {
$item = Get-ChildItem $_.Path
# Do things with item
}
Das problem das ich laufen in ist, dass wenn ich Master.bates schlägt fehl Get-ChildItem
mit einem Fehler entlang der Linien von
get-childitem : Cannot find path '\\remote-server\foothing' because it does not exist.
Aber es scheint zu funktionieren perfekt in Ordnung, wenn ich das Slave.ps1 - Datei direkt mit Powershell. Warum könnte das passiert nur, wenn die Master.bat - Datei ausgeführt wird?
Dinge, die ich versucht habe
- Voranstellen, die UNC-Pfade mit
FileSystem::
mit Anbietern http://powershell.org/wp/2014/02/20/powershell-gotcha-unc-paths-and-providers/ - So sicherzustellen, dass es keine seltsame Zeichen in die tatsächlichen Pfade
- Mit der
-literalPath
- parameter anstelle des einfachen-path
parameter fürGet-ChildItem
- Läuft
Get-ChildItem \\remote-server\foothing
in der PowerShell und folgenden, überprüfen Sie die Verbindung zum remote-server
InformationsquelleAutor der Frage Jon Chan | 2014-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gefunden habe dieses Problem beim ausführen von Skripts unter Bezugnahme auf UNC-Pfade - aber der Fehler tritt nur auf, wenn der Stamm der Skript gesetzt ist, um eine nicht Speicherort im Dateisystem. z.B. PS SQLSEVER\
Also der folgende schlägt mit der gleichen Fehlermeldung:
Also meine Auflösung war zu gewährleisten, dass die PS-Eingabeaufforderung zurückgegeben wurde, um einen Speicherort im Dateisystem vor dem ausführen dieses Codes. z.B.
Ich hoffe das hilft - ich wäre sehr glücklich mit dem Kopfgeld, da dies meine erste Antwort auf stack overflow.
P. S. ich vergaß hinzuzufügen, - die PS-Eingabeaufforderung root gesetzt werden können, durch automatisch geladene Module in der Konfiguration Ihrer Maschine. Ich würde überprüfen Sie mit Get-Location, um zu sehen, ob Sie tatsächlich executng aus einem nicht-Dateisystem Ort.
InformationsquelleAutor der Antwort Rory
Rory ' s Antwort bietet eine effektive Problemumgehung, aber es gibt eine Lösung, die keine änderung der aktuellen Position zu einem Dateisystem-provider-Speicherort ersten:
Präfix Ihre UNC-Pfade mit
FileSystem::
um sicherzustellen, dass Sie korrekt erkannt, unabhängig von der aktuellen Lage:Optionaler hintergrund-Informationen
Diese ausgezeichnete blog-post erläutert das zugrunde liegende problem (Hervorhebung Hinzugefügt):
Hinzufügen von Präfix
FileSystem::
eindeutig identifiziert den Pfad, als ein FileSystem-Anbieter Pfad, unabhängig von der zugrunde liegenden Anbieter die aktuelle Lage.InformationsquelleAutor der Antwort mklement0
Habe ich irgendwo gelesen, was über die
Push-Location
undPop-Location
Befehle zur Bekämpfung dieser Art von problem - dann landete ich auf Ihre Frage, während Sie manuell Schritt-für-Schritt, das testen einer neuen routine, wo das Skript verfügt über push/pop, aber ich habe vergessen, Sie zu tun auf meinem PS-Fenster. Nach Prüfung @Rory ' s Antwort, die ich bemerkte, war ich auf PS SQLServer:\ anstelle von PS C:\ Eingabeaufforderung.So eine Weise zu verwenden, diese auf Ihrer "slave" - Skript wäre:
Daran gedacht, indem Sie die Push/Pop-vor und nach der
# Do things
weil es scheint, dass es jene Dinge, die den Speicherort ändern.InformationsquelleAutor der Antwort João Ciocca