2012-06-28 13 views
8

Podczas korzystania z obiektu .NET z PowerShell i pobiera nazwę pliku, zawsze wydaje się być w stosunku do C:\Windows\System32.Dlaczego obiekty .NET w PowerShell nie używają bieżącego katalogu?

Na przykład:

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

... napisze C:\Windows\System32\hello.txt, zamiast C:\Current\Directory\hello.txt

Dlaczego PowerShell to zrobić? Czy to zachowanie można zmienić? Jeśli nie można go zmienić, jak to obejść?

Próbowałem już , ale to działa tylko z plikami, które już istnieją, i jest zbyt gadatliwe, aby robić to cały czas.

+1

możliwe duplikat [Dlaczego PowerShell rozdzielających ścieżek z $ home zamiast aktualnego katalogu?] (http://stackoverflow.com/questions/4071775/why-is-powershell-resolving-paths-from-home-instead-of-the-current-directory) –

Odpowiedz

7

Powody PowerShell nie zachowuje pojęcie .NET bieżącego katalogu roboczego w synchronizować z pojęciem PowerShell jest w katalogu roboczym są:

  1. PowerShell katalogi robocze mogą być dostawcy, który nie jest jeszcze plik systemowy oparciu np HKLM: \ Software
  2. Pojedynczy proces PowerShell może mieć wiele obszarów roboczych. Każdy obszar roboczy może być zapisany w katalogu cd_d do innej lokalizacji systemu. Jednak "katalog roboczy .NET/process" jest zasadniczo globalny dla tego procesu i nie działałby w przypadku scenariusza , w którym może istnieć wiele roboczych katalogów (jeden na runspace).
+1

Wystarczająco fair. Czy normalny proces PowerShell może mieć wiele obszarów roboczych? –

+2

@RogerLipscombe Nie jest bardzo często AFAICT dla PowerShell.exe do korzystania z wielu obszarów uruchamiania, ale silnik PowerShell zapewnia taką możliwość. Inne hosty, takie jak PowerShell_ISE i PowerGUI, wykorzystują wiele obszarów roboczych w ramach jednego procesu. Odpal ISE, naciśnij Ctrl + T (nowa karta uprawnień) i uruchom $ pid, a następnie $ ExecutionContext.Host.Runspace.InstanceId w każdej zakładce. Zauważ, że identyfikator procesu jest taki sam, ale identyfikator obszaru roboczego jest inny. –

0

To prawdopodobnie dlatego, że PowerShell działa w System32. Kiedy dysk CD do katalogu w PowerShell, to faktycznie nie zmienia katalogu roboczego powershell.exe.

Patrz:

PowerTip article on syncing the two directories

Channel9 forum thread

+0

Okazuje się, że jest to duplikat http: // stackoverflow.com/questions/4071775/why-is-powershell-resolving-paths-from-home-zamiast-of-the-current-directory, ale ponieważ pracuję na podwyższonym poziomie, nie jest to $ HOME. –

+0

Tak, to by to zrobiło - chociaż gdybyś nie był podniesiony i zrobiłeś 'cd $ folder', działałbyś na' $ HOME'. Ale w zasadzie dlatego nie szanuje $ PWD - ponieważ ten kod skutecznie prosił Windows o katalog roboczy procesu, ale zmienna $ PWD jest artefaktem PowerShell, a nie Windows. – JohnL

0

Podczas korzystania z nazwy plików w metodach Net, najlepszym rozwiązaniem jest, aby korzystać w pełni kwalifikowane nazwy ścieżki. Lub użyj

`$pwd\foo.cer` 

Jeśli zrobić w konsoli PowerShell od:

C:\> [Environment]::CurrentDirectory 

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

można zobaczyć, co folderu wykorzystanie .NET.

+1

Wystarczająco fair w skryptach. Pobiera stare prawdziwe szybko w linii poleceń. –

0

wpadłem na ten sam problem już dawno temu, a teraz dodam następujące do początku mojego profilu:

# 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

To odpowiada, dlaczego to System32, w moim komentarzu, dzięki; ale nie odpowiada bezpośrednio na pytanie. –

15

można zmienić .NET dir dir PowerShell do pracy robocza:
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
Po tej linii wszystkie .net podobne metody [io.path]::GetFullPath i [IO.File]::WriteAllText będzie działać bez problemów

Powiązane problemy