2016-12-01 1 views
0

Ich habe etwas Powershell-Code von der Antwort auf eine andere Frage und erstellte dieses Skript, änderte es leicht, so dass ich den Dateinamen übergeben konnte.Wie wird ein nicht qualifizierter Dateiname an ein Powershell-Skript übergeben?

$file = [System.io.File]::Open($Args[0], 'Open', 'Read', 'None') 
Write-Host "Press any key to continue..." 
$null = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
$file.Close() 

Es funktioniert gut, wenn ich es laufe (aus einem Fenster Powershell) mit der uneingeschränkten Datei, wenn in meinem Home-Verzeichnis oder mit ein vollständig qualifizierten Dateinamen in einem beliebigen Verzeichnis. Das Skript ist lockfile.ps1 in einem Dienstprogramme-Ordner auf meinem Pfad, und alle diese Aufrufe funktionieren wie erwartet.

C:\Users\SteveC.AFRICA> . lockfile abc.txt 
C:\Users\SteveC.AFRICA> lockfile abc.txt 
C:\Users\SteveC.AFRICA> lockfile .\abc.txt 
C:\Users\SteveC.AFRICA> lockfile D:\Junk\abc.txt 

Wenn jedoch das aktuelle Verzeichnis nicht mein Home-Verzeichnis ist, muß ich die Dateinamen auch für Dateien im aktuellen Verzeichnis vollständig qualifizieren. Also dieser Aufruf funktioniert

D:\Junk> lockfile D:\Junk\abc.txt 

aber diese nicht

D:\Junk> lockfile abc.txt 
D:\Junk> lockfile .\abc.txt 

beide folgende Fehlerberichterstattung, an, dass sie die uneingeschränkte Datei in meinem Home-Verzeichnis namens finden erwarten.

Exception calling "Open" with "4" argument(s): "Could not find file 'C:\Users\SteveC.AFRICA\abc.txt'." 

Warum ist das und was muss ich tun, um Skripte wie dies zu ermöglichen, richtig unqualifizierte Dateinamen als Parameter zu akzeptieren?

+2

'$ Args [0]' -> '(Konvertieren-Pfad $ Args [0])' – PetSerAl

+0

Vielen Dank. Willst du es eine Antwort machen, damit ich es als die angenommene Antwort markieren kann. –

Antwort

1

Ich denke, dass Sie zwei Dinge mischen: PowerShell Pfad und Provider (FileSystem Provider, vor allem) Pfad. Diese zwei Dinge sind anders.

In Powershell Sie Laufwerke, wie Sie sich, zum Beispiel erstellen:

New-PSDrive -Name Win -PSProvider FileSystem -Root C:\Windows 

Danach Sie so schreiben können:

Get-Content Win:\System.ini 

Natürlich, wenn Sie so etwas schreiben:

[System.IO.File]::ReadAllLines('Win:\System.ini') 

es wird fehlschlagen, aufgrund ReadAllLines weiß nichts über PowerShell und seine Win Laufwerk. Sie müssen den PowerShell-Pfad in den FileSystem-Providerpfad konvertieren, bevor Sie ihn an Dateisystem-APIs übergeben. Es kann mit Convert-Path Cmdlets erfolgen:

Convert-Path Win:\System.ini 

Um macht es einfach, diese Dinge zu mischen vereinfachen Übergang zu Powershell, FileSystem Anbieter ordnet automatisch Laufwerke Dateisystem Powershell mit dem gleichen Namen antreibt. Normalerweise bemerken Sie keine Unterscheidung. Aber für relative Pfade ist es nicht so gut, weil PowerShell current location and process current working directory are different things auch.

+0

Danke, ich denke, dass Ihre Erwähnung von Pfad und Anbieter verwirrender ist als alles andere. Nach einigem Nachdenken und Spielen macht es durchaus Sinn. Ich habe ein Skript erstellt, das die nicht konvertierten und konvertierten Versionen des übergebenen Dateinamens anzeigt und hervorgehoben, dass der nicht konvertierte Name relativ bleibt, während der konvertierte Name vollständig qualifiziert ist. Natürlich benötigt die .Net-Methode einen vollständig qualifizierten Namen, daher ist es notwendig, das Argument zu konvertieren, um es zu qualifizieren. –

Verwandte Themen