Dlaczego dane wyjściowe nie są w tym przypadku zgodne z c:\source\temp\test.txt
?Plik wyjściowy FileInfo programu PowerShell w katalogu potomnym
PS C:\source\temp> (New-Object IO.FileInfo .\test.txt).FullName
c:\source\test.txt
Dlaczego dane wyjściowe nie są w tym przypadku zgodne z c:\source\temp\test.txt
?Plik wyjściowy FileInfo programu PowerShell w katalogu potomnym
PS C:\source\temp> (New-Object IO.FileInfo .\test.txt).FullName
c:\source\test.txt
Ahh często wywołuje to ludzi w PowerShell. Chociaż PowerShell ma pojęcie bieżącego katalogu, to nie jest tożsamy z bieżącym katalogiem dla procesu. Powodem jest to, że proces systemu Windows może mieć tylko jeden bieżący katalog, podczas gdy proces PowerShell może mieć wiele obszarów roboczych/potoków, każdy z własnym katalogiem bieżącym, a katalog bieżący PowerShell może nawet nie być lokalizacją pliku.
. Metody .NET, które pobierają ścieżki względne, zostaną rozwiązane względem bieżącego katalogu procesu. Aby być bezpiecznym, podczas wywoływania metod .NET powinieneś używać w pełni rozwiązanych ścieżek. Można zrobić:
PS> (New-Object IO.FileInfo "$PWD\test.txt").FullName
$ PWD zostanie rozszerzony wewnątrz łańcucha (ze względu na cudzysłów) i jej zmienną automatyczną, która zawsze zwraca bieżący katalog roboczy. W rzeczywistości zwraca obiekt PathInfo, ponieważ łańcuch, który osadza, nie zawsze jest absolutną ścieżką fizyczną. Jeśli używasz PSDrives (na przykład mam temp: \ dysk zmapowany do mojego katalogu tymczasowego), musisz być bardziej bezpośredni.
PS> (New-Object IO.FileInfo "$($PWD.ProviderPath)\test.txt").FullName
Guru PowerShell może mieć bardziej zwięzłą składnię. Powyższe jest wprawdzie dość brzydkie.