2016-12-01 87 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方法需要一个完全限定的名字,所以有必要转换参数来限定它。 –

相关问题