2016-12-01 86 views
0

我從一個不同的問題的答案中獲得了一些Powershell代碼,並創建了這個腳本,稍微修改它,這樣我就可以傳入文件名。如何將不合格的文件名傳遞給Powershell腳本?

$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() 

,如果我有一個不合格的文件在我的主目錄時,或在任何目錄的完全合格的文件名,運行它(從PowerShell窗口),它工作正常。該腳本是我的路徑上的實用程序文件夾中的lockfile.ps1,並且這些調用都按預期工作。

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 

然而,在當前目錄不是我的主目錄,我需要即使是在當前目錄中的文件完全限定的文件名。所以這個調用工作

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

但這些不

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

兩個報告以下錯誤,說明他們希望找到我的家目錄中名爲不合格的文件。

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

這是爲什麼,我需要做什麼才能讓這樣的腳本正確接受不合格的文件名作爲參數?

+2

'$ Args [0]' - >'(Convert-Path $ Args [0])' – PetSerAl

+0

非常感謝。想讓它成爲答案,所以我可以將其標記爲已接受的答案。 –

回答

1

我想,你混合兩件事:PowerShell路徑和提供者(FileSystem提供者,特別是)路徑。這兩件事情是不同的。

在PowerShell中,您可以創建驅動器作爲你高興,例如:

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

之後,你可以這樣寫:

Get-Content Win:\System.ini 

當然,如果你寫的是這樣的:

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

它會失敗,因爲ReadAllLines不知道任何有關PowerShell及其0驅動器。您需要將PowerShell路徑轉換爲FileSystem供應商路徑,然後將其傳遞到文件系統API。它可以與Convert-Path小命令來完成:

Convert-Path Win:\System.ini 

可以很容易地混合這個事情簡化過渡到PowerShell中,將根據PowerShell具有相同名稱的驅動FileSystem提供商自動映射文件系統驅動器。所以,你通常不會注意到區別。但是對於相對路徑來說,這並不好,因爲PowerShell current location and process current working directory are different things也是如此。

+0

謝謝,我認爲你提到的路徑和提供者比其他任何東西都更容易混淆。經過一番思考和發揮,這是非常有意義的。我製作了一個腳本,顯示傳入的文件名的未轉換和轉換版本,並突出顯示未轉換的名稱保持相對,而轉換後的名稱完全合格。當然.Net方法需要一個完全限定的名字,所以有必要轉換參數來限定它。 –

相關問題