about_FileSystem_Provider

about_FileSystem_Provider

PowerShell의 FileSystem 공급자에 대해 알아보는 문서예요. 파일과 디렉터리를 조회하고, 복사하고, 옮기고, 내용을 관리하는 방법을 실제 명령어 예시와 함께 살펴봐요. 공급자가 노출하는 드라이브, 확장 형식 시스템, 승격된 파라미터까지 한 번에 정리했어요.

출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_filesystem_provider

본문

PowerShell FileSystem 공급자는 파일과 디렉터리를 조회(Get)하고, 추가(Add)하고, 변경(Change)하고, 비우고(Clear), 삭제(Delete)하는 기능을 제공해요.

FileSystem 드라이브는 컴퓨터에 있는 디렉터리와 파일을 담고 있는 계층 구조(namespace)예요. FileSystem 드라이브는 논리 드라이브나 물리 드라이브, 디렉터리, 또는 매핑된 네트워크 공유 중 하나일 수 있어요.

PowerShell 7.0부터는 Temp:라는 드라이브가 사용자의 임시 디렉터리 경로에 매핑돼요. PowerShell은 .NET의 GetTempPath() 메서드를 사용해 임시 폴더의 위치를 알아내요. Windows에서는 $Env:TEMP와 같은 위치이고, Windows가 아닌 시스템에서는 환경 변수가 정의되어 있지 않으면 $Env:TMPDIR 또는 /tmp와 같은 위치예요.

FileSystem 공급자는 이 문서에서 다루는 다음의 cmdlet들을 지원해요.

Types exposed by this provider

파일은 System.IO.FileInfo 클래스의 인스턴스이고, 디렉터리는 System.IO.DirectoryInfo 클래스의 인스턴스예요.

PowerShell의 확장 형식 시스템(Extended Type System)은 이 객체 형식에 추가 속성을 붙여 더 많은 정보를 제공해요. 일부 정보는 플랫폼에 따라 달라져요. 예를 들어 LinkType 속성에 들어갈 수 있는 값은 플랫폼과 사용 중인 파일 시스템에 따라 달라져요. Linux와 macOS 파일 시스템은 HardLinkSymLink를 지원하고, Windows NTFS는 HardLinkSymLink, Junction, 그리고 LinkType의 여러 다른 값을 지원해요.

Get-Item이나 Get-ChildItem을 사용해 링크된 항목의 정보를 조회할 때 Mode 속성에 l이 들어가서 링크임을 표시해요. LinkType 속성에는 링크의 종류가 들어가요.

AppExecLink 링크는 Microsoft Store에서 애플리케이션을 설치할 때 생성돼요. AppExecLink 링크의 경우 Windows는 LinkType이나 LinkTarget 속성에 값을 제공하지 않아요.

Get-Item ~\AppData\Local\Microsoft\WindowsApps\winget.exe

    Directory: C:\Users\user1\AppData\Local\Microsoft\WindowsApps

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
la---            6/8/2023 12:20 PM              0 winget.exe ->

FileSystem 공급자는 컴퓨터의 논리 드라이브를 PowerShell 드라이브로 매핑해서 데이터 저장소를 노출해요. FileSystem 드라이브를 사용하려면 드라이브 이름 뒤에 콜론(:)을 붙인 채로 해당 드라이브로 위치를 바꾸면 돼요.

Set-Location C:

다른 PowerShell 드라이브에서도 FileSystem 공급자를 사용할 수 있어요. 다른 위치에서 파일이나 디렉터리를 참조하려면 경로에 드라이브 이름(C:, D:, ...)을 사용하면 돼요.

참고

PowerShell은 별칭(alias)을 사용해 익숙한 방식으로 공급자 경로를 다룰 수 있게 해줘요. dirls 같은 명령은 이제 Get-ChildItem의 별칭이고, cdSet-Location의 별칭이며, pwdGet-Location의 별칭이에요.

Getting files and directories

Get-ChildItem cmdlet은 현재 위치의 모든 파일과 디렉터리를 반환해요. 다른 경로를 지정해서 검색할 수도 있고, 기본 제공되는 파라미터로 필터링하고 재귀 깊이를 조절할 수도 있어요.

Get-ChildItem

cmdlet 사용법을 더 자세히 읽으려면 Get-ChildItem을 참고하세요.

Copying files and directories

Copy-Item cmdlet은 파일과 디렉터리를 사용자가 지정한 위치로 복사해요. Get-ChildItem과 비슷하게 필터링하고 재귀적으로 처리하는 파라미터를 제공해요.

다음 명령은 C:\temp\ 경로 아래의 모든 파일과 디렉터리를 C:\Windows\Temp 폴더로 복사해요.

Copy-Item -Path C:\temp\* -Destination C:\Windows\Temp -Recurse -File

Copy-Item은 확인을 요청하지 않고 대상 디렉터리의 파일을 덮어써요.

이 명령은 C:\a 디렉터리의 a.txt 파일을 C:\a\bb 디렉터리로 복사해요.

Copy-Item -Path C:\a\a.txt -Destination C:\a\bb\a.txt

C:\a 디렉터리의 모든 디렉터리와 파일을 C:\c 디렉터리로 복사해요. 복사할 디렉터리가 대상 디렉터리에 이미 존재하면 Force 파라미터를 지정하지 않는 한 명령이 실패해요.

Copy-Item -Path C:\a\* -Destination C:\c -Recurse

자세한 내용은 Copy-Item을 참고하세요.

Moving files and directories

이 명령은 C:\a 디렉터리의 c.txt 파일을 C:\a\aa 디렉터리로 옮겨요:

Move-Item -Path C:\a\c.txt -Destination C:\a\aa

기본적으로 이 cmdlet은 이름이 같은 기존 파일을 덮어쓰지 않아요. 기존 파일을 덮어쓰게 하려면 Force 파라미터를 지정하면 돼요.

디렉터리가 현재 위치일 때는 그 디렉터리를 옮길 수 없어요. Move-Item으로 현재 위치의 디렉터리를 옮기려 하면 이런 오류가 뜨죠.

C:\temp> Move-Item -Path C:\temp\ -Destination C:\Windows\Temp

Move-Item : Cannot move item because the item at 'C:\temp\' is in use.
At line:1 char:1
+ Move-Item C:\temp\ C:\temp2\
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand

Managing file content

Get the content of a file

이 명령은 "Test.txt" 파일의 내용을 가져와서 콘솔에 표시해요.

Get-Content -Path Test.txt

파일의 내용을 다른 cmdlet으로 파이프할 수 있어요. 예를 들어 다음 명령은 Test.txt 파일의 내용을 읽어서 ConvertTo-Html cmdlet에 입력으로 넘겨줘요:

Get-Content -Path Test.txt | ConvertTo-Html

또한 공급자 경로 앞에 달러 기호($)를 붙여서 파일의 내용을 가져올 수도 있어요. 변수 이름 규칙 때문에 경로는 중괄호로 감싸야 해요. 자세한 내용은 about_Variables를 참고하세요.

${C:\Windows\System32\drivers\etc\hosts}

Add content to a file

이 명령은 "test content" 문자열을 Test.txt 파일에 덧붙여요:

Add-Content -Path test.txt -Value "test content"

Test.txt 파일에 있던 기존 내용은 삭제되지 않아요.

Replace the content of a file

이 명령은 Test.txt 파일의 내용을 "test content" 문자열로 바꿔요:

Set-Content -Path test.txt -Value "test content"

Test.txt의 내용을 덮어써요. 파일을 만들 때 내용을 함께 넣으려면 New-Item cmdlet의 Value 파라미터를 사용할 수도 있어요.

Loop through the contents of a file

기본적으로 Get-Content cmdlet은 줄 끝 문자를 구분자로 사용해요. 그래서 파일을 문자열의 모음으로 가져오는데, 파일의 각 줄이 하나의 문자열이 돼요.

Delimiter 파라미터를 사용해 다른 구분자를 지정할 수 있어요. 한 구역의 끝이나 다음 구역의 시작을 나타내는 문자로 설정하면 파일을 논리적인 부분들로 나눌 수 있어요.

첫 번째 명령은 Employees.txt 파일을 가져와서 "End of Employee Record"라는 단어로 끝나는 구역들로 나누고 $e 변수에 저장해요.

두 번째 명령은 배열 표기법을 사용해 $e에 담긴 모음에서 첫 번째 항목을 가져와요. PowerShell 배열은 0부터 시작하므로 인덱스 0을 사용해요.

Get-Content cmdlet에 대한 자세한 내용은 Get-Content 도움말 항목을 참고하세요.

배열에 대한 자세한 내용은 about_Arrays를 참고하세요.

$e = Get-Content C:\test\employees.txt -Delimited "End Of Employee Record"
$e[0]

Managing security descriptors

View the ACL for a file

이 명령은 System.Security.AccessControl.FileSecurity 객체를 반환해요:

Get-Acl -Path test.txt | Format-List -Property *

이 객체에 대해 더 자세히 알려면 명령을 Get-Member cmdlet으로 파이프하거나 FileSecurity 클래스를 참고하세요.

Creating files and directories

Create a directory

이 명령은 C 드라이브에 logfiles 디렉터리를 만들어요:

New-Item -Path C:\ -Name logfiles -Type Directory

PowerShell에는 New-Item cmdlet으로 새 디렉터리를 만드는 mkdir 함수(별칭 md)도 있어요.

Create a file

이 명령은 C:\logfiles 디렉터리에 log2.txt 파일을 만든 다음 파일에 "test log" 문자열을 추가해요:

New-Item -Path C:\logfiles -Name log2.txt -Type File

Create a file with content

C:\logfiles 디렉터리에 log2.txt라는 파일을 만들고 "test log" 문자열을 파일에 추가해요.

New-Item -Path C:\logfiles -Name log2.txt -Type File -Value "test log"

Renaming files and directories

Rename a file

이 명령은 C:\a 디렉터리의 a.txt 파일을 b.txt로 이름을 바꿔요:

Rename-Item -Path C:\a\a.txt -NewName b.txt

Rename a directory

이 명령은 C:\a\cc 디렉터리를 C:\a\dd로 이름을 바꿔요:

Rename-Item -Path C:\a\cc -NewName dd

Deleting files and directories

Delete a file

이 명령은 현재 위치의 Test.txt 파일을 삭제해요:

Remove-Item -Path test.txt

Delete files using wildcards

이 명령은 현재 위치에서 .xml 파일 확장자를 가진 모든 파일을 삭제해요:

Remove-Item -Path *.xml

Starting a program by invoking an associated file

Invoke a file

Get-Service cmdlet은 로컬 서비스에 대한 정보를 가져오고, 그 정보를 Export-Csv cmdlet으로 파이프해서 Services.csv 파일에 저장해요.

그런 다음 Invoke-Item.csv 확장자와 연결된 프로그램으로 services.csv 파일을 열어요:

Get-Service | Export-Csv -Path services.csv
Invoke-Item -Path services.csv

Getting files and folders with specified attributes

Get System files

이 명령은 현재 디렉터리와 하위 디렉터리의 시스템 파일을 가져와요.

File 파라미터로 파일(디렉터리가 아닌)만 가져오고, System 파라미터로 "system" 특성을 가진 항목만 가져와요.

Recurse 파라미터로 현재 디렉터리와 모든 하위 디렉터리의 항목을 가져와요.

Get-ChildItem -File -System -Recurse

Get Hidden files

이 명령은 현재 디렉터리의 숨김 파일을 포함한 모든 파일을 가져와요.

Attributes 파라미터에 !Directory+Hidden!Directory 두 값을 사용하는데, 전자는 숨김 파일을 가져오고 후자는 그 외의 모든 파일을 가져와요.

Get-ChildItem -Attributes !Directory,!Directory+Hidden

dir -Att !d,!d+h는 이 명령과 같은 의미예요.

Get Compressed and Encrypted files

이 명령은 현재 디렉터리에서 압축되거나 암호화된 파일을 가져와요.

Attributes 파라미터에 CompressedEncrypted 두 값을 사용해요. 값들을 쉼표 ,로 구분하는데, 쉼표는 "OR" 연산자를 의미해요.

Get-ChildItem -Attributes Compressed,Encrypted

Dynamic parameters

동적 파라미터(dynamic parameters)는 PowerShell 공급자가 추가하는 cmdlet 파라미터로, 해당 cmdlet을 공급자가 활성화된 드라이브에서 사용할 때만 사용할 수 있어요.

Encoding

파일 인코딩을 지정해요. 기본값은 ASCII예요.

  • ascii: ASCII(7비트) 문자 집합의 인코딩을 사용해요.
  • bigendianunicode: big-endian 바이트 순서를 사용해 UTF-16 형식으로 인코딩해요.
  • bigendianutf32: big-endian 바이트 순서를 사용해 UTF-32 형식으로 인코딩해요.
  • oem: MS-DOS와 콘솔 프로그램의 기본 인코딩을 사용해요.
  • unicode: little-endian 바이트 순서를 사용해 UTF-16 형식으로 인코딩해요.
  • utf7: UTF-7 형식으로 인코딩해요.
  • utf8: UTF-8 형식으로 인코딩해요.
  • utf8BOM: BOM(Byte Order Mark)과 함께 UTF-8 형식으로 인코딩해요.
  • utf8NoBOM: BOM(Byte Order Mark) 없이 UTF-8 형식으로 인코딩해요.
  • utf32: UTF-32 형식으로 인코딩해요.

Cmdlets supported

  • Add-Content
  • Get-Content
  • Set-Content

Delimiter

Get-Content가 파일을 읽으면서 객체로 나눌 때 사용하는 구분자를 지정해요.

기본값은 줄 끝 문자인 \n이에요.

텍스트 파일을 읽을 때 Get-Content는 각각이 구분자 문자로 끝나는 문자열 객체의 모음을 반환해요.

파일에 존재하지 않는 구분자를 입력하면 Get-Content는 파일 전체를 구분되지 않은 하나의 객체로 반환해요.

이 파라미터로 큰 파일을 더 작은 파일로 나눌 수도 있어요. "End of Example" 같은 파일 구분자를 구분자로 지정하면 되죠. 구분자는 버려지지 않고 보존되어 각 파일 구역의 마지막 항목이 돼요.

참고

현재는 Delimiter 파라미터 값이 빈 문자열이면 Get-Content가 아무것도 반환하지 않아요. 이건 알려진 문제예요. Get-Content가 파일 전체를 하나의 구분되지 않은 문자열로 반환하게 하려면 파일에 존재하지 않는 값을 입력하면 돼요.

Cmdlets supported

  • Get-Content

Wait

파일에 내용이 추가되기를 기다려요. 내용이 추가되면 추가된 내용을 반환해요. 내용이 변경되면 파일 전체를 반환해요.

기다리는 동안 Get-Content는 CTRL+C를 누르는 등으로 중단할 때까지 매초 한 번씩 파일을 확인해요.

Cmdlets supported

  • Get-Content

Attributes

지정한 특성을 가진 파일과 폴더를 가져와요. 이 파라미터는 모든 특성을 지원하고, 특성의 복잡한 조합을 지정할 수 있게 해줘요.

Attributes 파라미터는 Windows PowerShell 3.0에서 도입되었어요.

Attributes 파라미터는 다음 특성을 지원해요:

  • Archive
  • Compressed
  • Device
  • Directory
  • Encrypted
  • Hidden
  • Normal
  • NotContentIndexed
  • Offline
  • ReadOnly
  • ReparsePoint
  • SparseFile
  • System
  • Temporary

이 특성들에 대한 설명은 FileAttributes 열거형을 참고하세요.

특성을 조합하려면 다음 연산자를 사용해요.

  • ! - NOT
  • + - AND
  • , - OR

연산자와 특성 사이에는 공백이 허용되지 않아요. 다만 쉼표 앞에는 공백이 허용돼요.

Cmdlets supported

  • Get-ChildItem

Directory

디렉터리(폴더)를 가져와요.

Directory 파라미터는 Windows PowerShell 3.0에서 도입되었어요.

디렉터리만 가져오려면 Directory 파라미터를 사용하고 File 파라미터는 빼면 돼요. 디렉터리를 제외하려면 File 파라미터를 사용하고 Directory 파라미터를 빼거나, Attributes 파라미터를 사용하면 돼요.

Cmdlets supported

  • Get-ChildItem

File

파일을 가져와요.

File 파라미터는 Windows PowerShell 3.0에서 도입되었어요.

파일만 가져오려면 File 파라미터를 사용하고 Directory 파라미터는 빼면 돼요. 파일을 제외하려면 Directory 파라미터를 사용하고 File 파라미터를 빼거나, Attributes 파라미터를 사용하면 돼요.

Cmdlets supported

  • Get-ChildItem

Hidden

숨김 파일과 디렉터리(폴더)만 가져와요. 기본적으로 Get-ChildItem은 숨김 항목이 아닌 항목만 가져와요.

Hidden 파라미터는 Windows PowerShell 3.0에서 도입되었어요.

숨김 항목만 가져오려면 Hidden 파라미터나 그 별칭 h 또는 ah, 또는 Attributes 파라미터의 Hidden 값을 사용하면 돼요. 숨김 항목을 제외하려면 Hidden 파라미터를 빼거나 Attributes 파라미터를 사용하면 돼요.

Cmdlets supported

  • Get-ChildItem

ReadOnly

읽기 전용 파일과 디렉터리(폴더)만 가져와요.

ReadOnly 파라미터는 Windows PowerShell 3.0에서 도입되었어요.

읽기 전용 항목만 가져오려면 ReadOnly 파라미터나 그 별칭 ar, 또는 Attributes 파라미터의 ReadOnly 값을 사용하면 돼요. 읽기 전용 항목을 제외하려면 Attributes 파라미터를 사용하면 돼요.

Cmdlets supported

  • Get-ChildItem

System

시스템 파일과 디렉터리(폴더)만 가져와요.

System 파라미터는 Windows PowerShell 3.0에서 도입되었어요.

시스템 파일과 폴더만 가져오려면 System 파라미터나 그 별칭 as, 또는 Attributes 파라미터의 System 값을 사용하면 돼요. 시스템 파일과 폴더를 제외하려면 Attributes 파라미터를 사용하면 돼요.

Cmdlets supported

  • Get-ChildItem

NewerThan

파일의 LastWriteTime 값이 지정한 날짜보다 크면 $true를 반환하고, 그렇지 않으면 $false를 반환해요.

Get-Date cmdlet이 반환하는 것 같은 DateTime 객체를 입력하거나, "August 10, 2011 2:00 PM"처럼 DateTime 객체로 변환할 수 있는 문자열을 입력하면 돼요.

Cmdlets supported

OlderThan

파일의 LastWriteTime 값이 지정한 날짜보다 작으면 $true를 반환하고, 그렇지 않으면 $false를 반환해요.

Get-Date cmdlet이 반환하는 것 같은 DateTime 객체를 입력하거나, "August 10, 2011 2:00 PM"처럼 DateTime 객체로 변환할 수 있는 문자열을 입력하면 돼요.

Cmdlets supported

  • Test-Path

Stream

대체 데이터 스트림(alternate data streams)을 관리해요. 스트림 이름을 입력하면 돼요. 파일 시스템 드라이브의 Get-ItemRemove-Item 명령에서만 와일드카드를 쓸 수 있어요.

Cmdlets supported

  • Add-Content
  • Clear-Content
  • Get-Item
  • Get-Content
  • Remove-Item
  • Set-Content

Raw

줄 바꿈 문자를 무시해요. 내용을 단일 항목으로 반환해요.

Cmdlets supported

  • Get-Content

ItemType

이 파라미터는 New-Item으로 만들 항목의 종류를 지정할 수 있게 해줘요.

이 파라미터의 사용 가능한 값은 현재 사용 중인 공급자에 따라 달라져요.

FileSystem 드라이브에서는 다음 값이 허용돼요:

  • File
  • Directory
  • SymbolicLink
  • Junction
  • HardLink

Cmdlets supported

  • New-Item

Using the pipeline

공급자 cmdlet은 파이프라인 입력을 받아들여요. 파이프라인을 사용하면 공급자 데이터를 한 cmdlet에서 다른 공급자 cmdlet으로 보내 작업을 단순화할 수 있어요. 공급자 cmdlet과 파이프라인을 함께 사용하는 방법을 더 자세히 보려면 이 문서 곳곳에 있는 cmdlet 참조를 보면 돼요.

Getting help

Windows PowerShell 3.0부터는 파일 시스템 드라이브에서 해당 cmdlet이 어떻게 동작하는지 설명하는, 공급자 cmdlet을 위한 맞춤형 도움말 항목을 얻을 수 있어요.

파일 시스템 드라이브에 맞춤화된 도움말 항목을 얻으려면 파일 시스템 드라이브에서 Get-Help 명령을 실행하거나 Get-HelpPath 파라미터로 파일 시스템 드라이브를 지정하면 돼요.

Get-Help Get-ChildItem
Get-Help Get-ChildItem -Path c:

더 알아보기