programing

왜 안 돼요?PowerShell의 NET 개체가 현재 디렉토리를 사용합니까?

itmemos 2023. 10. 24. 20:11
반응형

왜 안 돼요?PowerShell의 NET 개체가 현재 디렉토리를 사용합니까?

a를 사용할 때.PowerShell의 NET 개체는 파일 이름을 가져갑니다. 항상 상대적인 것으로 보입니다.C:\Windows\System32.

예를 들어,

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

...글을 쓸 것입니다.C:\Windows\System32\hello.txt,보다는C:\Current\Directory\hello.txt

PowerShell이 이 작업을 수행하는 이유는 무엇입니까?이 동작을 변경할 수 있습니까?변경할 수 없다면 어떻게 해야 합니까?

노력했습니다.Resolve-Path, 하지만 이는 이미 존재하는 파일에서만 작동하며, 항상 하기에는 너무 장황합니다.

.networking dir을 powershellworking dir로 변경할 수 있습니다.
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
이 행 뒤에 모든 .net 메서드는 다음과 같습니다.[io.path]::GetFullPath그리고.[IO.File]::WriteAllText문제없이 작동할 것입니다.

PowerShell이 이를 지키지 않는 이유.PowerShell의 작업 디렉토리 개념과 일치하는 현재 작업 디렉토리의 NET 개념은 다음과 같습니다.

  1. PowerShell 작업용 dir는 파일 시스템 기반이 아닌 공급업체에 있을 수 있습니다.HKLM:\소프트웨어
  2. 단일 PowerShell 프로세스에는 여러 개의 실행 공간이 있을 수 있습니다.각각의 실행 공간은 서로 다른 파일 시스템 위치로 cd'd될 수 있습니다.하지만, 그.NET/프로세스 "워킹 디렉토리"는 본질적으로 프로세스 전체적인 것이며 여러 워킹디렉터(런스페이스당 하나)가 존재할 수 있는 시나리오에서는 작동하지 않습니다.

편의를 위해 다음 사항을 추가했습니다.prompt명령이 완료될 때마다 실행되도록 기능합니다.

# Make .NET's current directory follow PowerShell's
# current directory, if possible.
if ($PWD.Provider.Name -eq 'FileSystem') {
    [System.IO.Directory]::SetCurrentDirectory($PWD)
}

이는 어떤 스크립트(Win32 작업 디렉토리가 PowerShell 작업 디렉토리를 추적한다고 가정함)가 내 컴퓨터에서는 작동하지만 다른 스크립트에서는 작동하지 않기 때문에 반드시 좋은 아이디어는 아닙니다.

에서 파일 이름을 사용하는 경우.넷 메소드, 최선의 방법은 완전한 경로 이름을 사용하는 것입니다.아니면 사용

$pwd\foo.cer

powershell 콘솔에서 다음을 수행하는 경우:

C:\> [Environment]::CurrentDirectory

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

.net 은 어떤 폴더를 사용하는지 알 수 있습니다.

그 이유는 시스템32에서 PowerShell이 실행되고 있기 때문일 것입니다.PowerShell의 디렉토리에 cd할 때 powershell.exe의 작업 디렉토리는 실제로 변경되지 않습니다.

참조:

두 디렉터리 동기화에 대한 PowerTip 기사

채널 9 포럼 스레드

저는 오래전에 같은 문제에 부딪혔고 지금은 프로필의 처음에 다음을 추가합니다.

# 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
}

언급URL : https://stackoverflow.com/questions/11246068/why-dont-net-objects-in-powershell-use-the-current-directory

반응형