2012-06-28 44 views
8

當您使用PowerShell中的.NET對象並且需要文件名時,它似乎總是相對於C:\Windows\System32爲什麼PowerShell中的.NET對象不使用當前目錄?

例如:

[IO.File]::WriteAllText('hello.txt', 'Hello World') 

...會寫C:\Windows\System32\hello.txt,而不是C:\Current\Directory\hello.txt

爲什麼PowerShell中做到這一點?這種行爲可以改變嗎?如果它不能改變,我該如何解決它?

我試過Resolve-Path,但只適用於已經存在的文件,而且它太冗長了,無法一直做下去。

+1

可能重複$ home,而不是當前目錄?](http://stackoverflow.com/questions/4071775/why-is-powershell-resolving-paths-from-home-instead-of-the-current-directory) –

回答

7

的原因PowerShell不會保留當前工作目錄的.NET概念中與工作目錄的PowerShell的概念同步是:

  1. PowerShell的工作迪爾斯可以在甚至沒有文件系統 例如基於提供商HKLM:\軟件
  2. 單個PowerShell進程可以有多個運行空間 。每個運行空間可以cd`d到不同的文件 系統位置。但是.NET /進程「工作目錄」實質上是一個全局的進程,並且不適用於可能有多個工作目錄(每個運行空間一個)的 場景。
+1

夠公平的。普通的PowerShell進程可以有多個運行空間嗎? –

+2

@RogerLipscombe PowerShell.exe使用多個運行空間不是很常見的AFAICT,但PowerShell引擎提供了這種功能。 PowerShell_ISE和PowerGUI等其他主機利用單個進程中的多個運行空間。啓動ISE,按Ctrl + T(新的PowerShell標籤)並運行$ pid,然後在每個選項卡中執行$ ExecutionContext.Host.Runspace.InstanceId。注意進程標識是相同的,但運行空間標識是不同的。 –

0

這可能是因爲PowerShell在System32中運行。當您在PowerShell中切換到某個目錄時,它實際上並不會更改powershell.exe的工作目錄。

參見:

PowerTip article on syncing the two directories

Channel9 forum thread

+0

原來,這是http:// stackoverflow的重複。com/questions/4071775/why-is-powershell-resolving-paths-from-home-instead-of-the-current-directory,但是因爲我正在運行提升,它不是$ HOME。 –

+0

是的,這樣做 - 儘管如果你沒有提升,你做了'cd $文件夾',你將在'$ HOME'上運行。但基本上這就是爲什麼它不尊重$ PWD - 因爲該代碼有效地向Windows請求進程工作目錄,但$ PWD變量是PowerShell工件,而不是Windows工件。 – JohnL

0

當您使用.NET方法名,最好的做法是使用完全合格的路徑名。或者使用

`$pwd\foo.cer` 

如果您在PowerShell中的控制檯做:

C:\> [Environment]::CurrentDirectory 

C:\WINDOWS\system32\WindowsPowerShell\v1.0 

你可以看到什麼文件夾.NET中使用。

+1

足夠公平的腳本。在命令行上快速獲取舊版本。 –

0

我很久以前碰到了同樣的問題,現在我以下內容添加到我的個人資料的開頭:

# Setup user environment when running session under alternate credentials and 
# logged in as a normal user. 
if ((Get-PSProvider FileSystem).Home -eq "") 
{ 
    Set-Variable HOME $env:USERPROFILE -Force 
    $env:HOMEDRIVE = Split-Path $HOME -Qualifier 
    $env:HOMEPATH = Split-Path $HOME -NoQualifier 
    (Get-PSProvider FileSystem).Home = $HOME 
    Set-Location $HOME 
} 
+0

這回答了爲什麼它是System32,在我的評論中,謝謝;但它並不直接回答這個問題。 –

15

您可以更改.NET工作目錄到PowerShell的工作目錄:
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
這一行後像[io.path]::GetFullPath[IO.File]::WriteAllText所有的.NET方法不會有任何問題的工作

的[自爲什麼PowerShell的解決路徑
相關問題