2012-06-28 30 views
8

Khi bạn sử dụng đối tượng .NET từ PowerShell và phải có tên tệp, tên này dường như luôn liên quan đến C:\Windows\System32.Tại sao các đối tượng .NET trong PowerShell không sử dụng thư mục hiện tại?

Ví dụ:

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

... sẽ viết C:\Windows\System32\hello.txt, chứ không phải là C:\Current\Directory\hello.txt

Tại sao PowerShell làm điều này? Hành vi này có thể thay đổi không? Nếu nó không thể thay đổi, làm thế nào để tôi làm việc xung quanh nó?

Tôi đã thử Resolve-Path, nhưng chỉ hoạt động với các tệp đã tồn tại và quá dài để làm mọi lúc.

+1

thể trùng lặp của [Tại sao PowerShell giải quyết con đường từ $ home thay vì thư mục hiện tại?] (http://stackoverflow.com/questions/4071775/why-is-powershell-resolving-paths-from-home-instead-of-the-current-directory) –

Trả lời

7

Những lý do PowerShell không giữ quan điểm cho .NET của thư mục làm việc hiện tại đồng bộ với khái niệm của PowerShell về thư mục hoạt động là:

  1. Thư mục làm việc PowerShell có thể nằm trong nhà cung cấp thậm chí không phải là hệ thống tệp dựa ví dụ HKLM: \ Software
  2. Quá trình PowerShell đơn lẻ có thể có nhiều không gian chạy. Mỗi runspace có thể được cd`d vào một tập tin khác nhau vị trí hệ thống. Tuy nhiên, .NET/process "working directory" là về bản chất là toàn cầu cho quá trình và sẽ không hoạt động cho một kịch bản , nơi có thể có nhiều thư mục làm việc (một cho mỗi không gian chạy).
+1

Đủ công bằng. Quá trình PowerShell bình thường có nhiều không gian chạy không? –

+2

@RogerLipscombe Nó không phải là rất phổ biến AFAICT cho PowerShell.exe để sử dụng nhiều không gian chạy nhưng động cơ PowerShell cung cấp khả năng. Các máy chủ khác như PowerShell_ISE và PowerGUI tận dụng nhiều không gian chạy trong một quy trình. Khởi động ISE, nhấn Ctrl + T (tab powershell mới) và chạy $ pid theo sau là $ ExecutionContext.Host.Runspace.InstanceId trong mỗi tab. Lưu ý rằng id quá trình giống nhau nhưng id không gian chạy là khác nhau. –

0

Đó có thể là do PowerShell đang chạy trong System32. Khi bạn cd vào một thư mục trong PowerShell, nó không thực sự thay đổi thư mục làm việc của PowerShell.exe.

Xem:

PowerTip article on syncing the two directories

Channel9 forum thread

+0

Chỉ ra rằng đây là bản sao của lưu lượng truy cập http: // stackoverflow.com/questions/4071775/why-is-powershell-giải quyết-đường dẫn-từ-nhà-thay vì-of-the-hiện-thư mục, nhưng bởi vì tôi đang chạy lên cao, nó không phải là $ HOME. –

+0

Đúng, điều đó sẽ làm được - mặc dù nếu bạn không được nâng lên và bạn đã làm 'cd $ folder', bạn sẽ hoạt động trên' $ HOME'. Nhưng về cơ bản đó là lý do tại sao nó không tôn trọng $ PWD - bởi vì mã đó đã yêu cầu Windows cho thư mục làm việc quá trình, nhưng biến $ PWD là một tạo phẩm PowerShell, không phải là một Windows. – JohnL

0

Khi bạn sử dụng tên tập tin trong các phương pháp Net, việc thực hành tốt nhất là sử dụng tên đường dẫn đầy đủ điều kiện. Hoặc sử dụng

`$pwd\foo.cer` 

Nếu bạn làm trong PowerShell console từ:

C:\> [Environment]::CurrentDirectory 

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

bạn có thể xem những gì thư mục sử dụng .net.

+1

Đủ công bằng trong tập lệnh. Được thực sự nhanh chóng trên dòng lệnh. –

0

Tôi chạy vào cùng một vấn đề trong một thời gian dài trước đây và bây giờ tôi thêm dòng sau vào đầu của my profile:

# 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

Đó là lý do tại sao đó là System32, trong bình luận của tôi, cảm ơn; nhưng nó không trực tiếp trả lời câu hỏi. –

15

Bạn có thể thay đổi .net dir làm việc để PowerShell dir làm việc:
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
Sau dòng này tất cả các phương pháp .net như [io.path]::GetFullPath[IO.File]::WriteAllText sẽ làm việc mà không vấn đề

Các vấn đề liên quan