Windows PC를 자동화하는 8가지 무료 도구
우리 모두는 PC에서 자동화하고 싶은 반복적인 작업을 갖고 있습니다. 다행히도, 이러한 문제를 해결하고 시간을 보다 효율적으로 사용하는 데 도움이 되는 타사 Windows 앱이 많이 있습니다.
PC가 지루한 작업을 대신 처리해준다면 어떨까요? Windows PowerShell을 사용하면 이것이 가능합니다. PowerShell을 사용하여 아무도 계속해서 하고 싶어하지 않는 반복적인 일상 작업을 자동화하는 방법은 다음과 같습니다.
목차
Microsoft PowerShell은 관리자를 위한 강력한 도구인 명령줄 유틸리티이자 스크립팅 언어로, 컴퓨터와 네트워크의 다양한 작업을 자동화할 수 있습니다. PowerShell에는 명령 프롬프트의 구성 요소가 포함되어 있으며 .NET 프레임워크를 기반으로 구축되었습니다. WebTech360에 대해 읽고 있다면 PowerShell이 IT 관리자가 대규모 네트워크를 관리하는 데 선택하는 도구라는 것을 알아야 합니다.
PowerShell을 사용하는 방법을 배우면 지루한 일상 업무가 간소화됩니다. 각 서버를 개별적으로 조정하지 않고도 네트워크를 통해 시스템 전체에 대한 변경 작업을 수행할 수 있습니다. PowerShell은 하이브리드 클라우드 환경을 운영하는 데 필수적인 부분이 되어 가고 있습니다 .
PowerShell은 다양한 용도로 사용할 수 있어 작업 효율성을 높이고 네트워크를 효율적으로 운영하는 데 도움이 됩니다. 가장 기본적인 사용 사례로는 시스템에 대한 일일 업데이트 일정을 잡고, 현재 프로세스에 대한 보고서를 생성하고, 정기 서비스를 제공하는 것 등이 있습니다. 이러한 작업 중 다수는 GUI를 통해 수행할 수 있는 것은 사실이지만 PowerShell의 요점은 이를 더 빠르게 수행하는 것입니다.
설정하는 데 몇 분이 걸리는 정기적인 유지 관리 작업이 있는 경우 동일한 기능을 단일의 명명된 PowerShell 명령으로 스크립팅할 수 있습니다. 그러니 다음에 해당 스크립트를 열면 백그라운드에서 실행될 겁니다. PowerShell의 스크립팅 논리를 익히고, 객체와 var(변수)의 작동 방식을 이해하고, 이를 네트워크에서 지능적으로 구현하다 보면 왜 일찍 PowerShell을 사용하지 않았는지 의아해질 것입니다.
이 튜토리얼에서는 PowerShell의 기본 사항을 다루며, IT를 처음 접하는 사람, 특히 Windows 명령 프롬프트에 익숙한 사람에게 도움이 될 것입니다. 이 문서에서는 기본 도구와 명령을 사용하는 방법, 파일과 폴더를 조작하는 방법, 객체를 이해하는 방법, 변수를 사용하는 방법, 원격 서버를 관리하는 방법을 소개합니다.
Windows NT가 출시된 후, CMD.EXE가 Windows의 명령줄 유틸리티가 되었습니다. CMD.EXE는 DOS 이전 버전(COMMAN.COM)에서 일부 구성 요소를 물려받았지만 여전히 Windows 명령 파일(.CMD 및 .BAT)을 사용하는 다소 "원시적인" 스크립팅 언어를 기반으로 했습니다. Windows Scripting Host와 VBScript, JScript 언어가 추가되어 유틸리티의 스크립팅 기능이 크게 향상되었습니다.
이러한 기술은 고급 명령줄 유틸리티와 스크립팅 환경이 균형 있게 결합된 것입니다. 실제로 얼마나 많은 CMD.EXE, .CMD 및 Windows Scripting Host 파일을 조작할 수 있는가 하는 문제는 실제 문제가 아닙니다. 사람들이 가장 불평하고 걱정하는 것은 겉보기에 간단한 작업을 완료하는 것입니다.
명령줄과 스크립팅 도구의 "프레임워크"를 사용하면 어느 정도 포괄적인 스크립트에는 배치 명령, Windows 스크립팅 호스트 및 독립 실행형 실행 파일의 조합이 필요합니다. 각 스크립트는 실행 및 데이터 요청, 구문 분석, 반환에 대해 서로 다른 규칙을 사용합니다.
CMD.EXE의 취약한 변수 지원, 일관되지 않은 인터페이스, Windows 설정에 대한 제한된 액세스, 또 다른 약점이 결합되어 명령줄 스크립팅을 구현하고 사용하기가 더 어렵습니다. 여기서 '다른 약점'이 무엇인지 궁금하실 겁니다. 이것은 일반 텍스트라는 점에 유의하세요. 이러한 기술에서는 모든 것이 텍스트 형태입니다. 명령이나 스크립트의 출력은 텍스트이며, 다음 명령의 입력으로 활용하려면 구문 분석하고 다시 포맷해야 합니다. 이는 PowerShell이 모든 기존 셸에서 취하는 기본적인 시작점입니다.
이 섹션에서 소개하는 세 가지 개념은 PowerShell의 기반을 형성하는 핵심 개념을 이해하는 데 필요한 아주 기본적인 내용입니다. PowerShell 명령에 접근할 때 더욱 고급 개념을 배우고 익히는 데 더 많은 시간을 투자해야 합니다.
PowerShell은 Windows 10, Windows 7, Windows Server 2008 R2 및 최신 버전의 Windows에 기본적으로 설치됩니다. PowerShell의 새 버전에서는 새로운 기능과 "cmdlet"(PowerShell 명령을 Microsoft에서 부르는 용어로, "command-let"이라고 발음)이 추가되고 Windows Management Framework(WMF)의 해당 버전과 함께 설치됩니다.
현재 권장되는 최신 버전은 WMF 5.1입니다. 어떤 경우에는 일부 새로운 기능이 WMF 버전 외에도 운영 체제에 따라 달라집니다. 예를 들어, Windows 8과 Windows Server 2012는 특정 TCP/IP 포트 에 대한 연결을 테스트할 수 있는 Test-NetConnection cmdlet을 지원하지만 , WMF의 최신 버전을 실행하더라도 Windows 7에서는 이 cmdlet을 사용할 수 없습니다.
대부분의 Windows 시스템에서는 사용자가 PowerShell 콘솔과 PowerShell ISE(통합 스크립팅 환경)라는 두 가지 PowerShell 환경을 사용할 수 있습니다. PowerShell 콘솔은 기존 명령줄처럼 보이지만 그 뒤에는 PowerShell의 모든 기능이 포함되어 있습니다. PowerShell 콘솔에서 변수 이름, 루프, 명령 자동 완성 및 파이핑을 사용할 수 있습니다.
더욱 고급적인 용도(스크립트 작성 등)를 위해 PowerShell ISE는 명령 자동 완성, 코드 강조 표시, Microsoft의 Intellisense 코드 완성 기능을 제공하여 PowerShell 코드를 만들고 테스트하는 데 도움을 줍니다. PowerShell ISE를 사용하면 탭 탐색을 사용하여 여러 PowerShell 스크립트를 동시에 작업할 수도 있습니다.
PowerShell 명령의 기반은 cmdlet입니다. Microsoft는 PowerShell에서 cmdlet을 만들 때 여러 가지 설계 전략을 사용했습니다.
첫 번째는 cmdlet 이름을 쉽게 유추하거나 적어도 더 쉽게 찾을 수 있게 만드는 기능입니다. PowerShell 명령이나 cmdlet은 표준화된 구문을 통해 사용이 더욱 편리하도록 설계되어 명령줄 인터페이스에서 스크립트를 더 쉽게 만들 수 있습니다.
해당 cmdlet은 Get-Service, Stop-Service 또는 Import-Csv와 같이 동사-명사 형식을 사용합니다. cmdlet 이름의 동사 부분은 명사에 대해 수행되는 작업을 나타냅니다. 일반적으로 정보를 검색하는 데 사용되는 cmdlet에는 Get-Process 또는 Get-Content 와 같이 이름에 Get이라는 동사가 포함됩니다 . 무언가를 편집하는 데 사용되는 명령은 일반적으로 동사 Set 으로 시작하고 , 어딘가에 새로운 엔터티를 추가하는 명령은 일반적으로 Add 또는 New 로 시작합니다 .
둘째, PowerShell에서 일반적으로 사용되는 매개변수에도 표준화된 이름이 지정됩니다. 예를 들어, -ComputerName 매개 변수를 사용하면 cmdlet을 하나 이상의 원격 컴퓨터에서 실행할 수 있습니다. - 자격 증명은 특정 사용자로 명령을 실행하기 위해 사용자 자격 증명을 포함하는 인증 개체를 제공하는 데 사용됩니다.
cmdlet과 매개변수에 별칭을 사용하면 키 입력을 절약하여 명령의 전체 길이를 줄일 수 있습니다(여러 명령을 함께 연결할 때 매우 유용함). 이러한 별칭은 항상 표준 명명 규칙을 사용하지는 않지만 여전히 기존 명령줄 유틸리티를 반영합니다.
PowerShell에서 DIR, CD, DEL, CLS와 같은 별칭은 각각 Get-ChildItem, Set-Location, Remove-Item, Clear-Host cmdlet에 해당합니다. 매개변수 별칭은 두 가지 방식으로 작동할 수 있습니다. cmdlet에서 제공하는 미리 정의된 별칭을 사용하거나 cmdlet에서 지원하는 매개변수 간에 고유한 일치 항목을 생성할 만큼 충분한 문자를 입력하여 별칭을 지정할 수 있습니다.
대부분의 시스템 관리자는 작업 과정에서 파일과 폴더를 조작해야 합니다. 예를 들어, 폴더를 서버의 다른 위치로 이동하거나, 로그 파일을 보관하거나, 대용량 파일을 검색하는 등의 작업이 있습니다. 동일한 작업이 여러 파일에 반복되는 경우 PowerShell을 사용하여 이를 자동화하면 시간을 절약할 수 있는 효과적인 솔루션이 됩니다.
컴퓨터가 처음 등장했을 당시 관리자가 파일과 디렉토리를 찾기 위해 처음 배운 명령줄 도구 중 하나는 dir 명령이었습니다. Dir은 지정된 디렉토리에 포함된 파일과 디렉토리를 나열합니다.
PowerShell에는 Get-ChildItem Cmdlet 형태의 비슷한 명령이 있습니다 . Get-ChildItem을 사용하면 파이프 명령을 통해 파일을 조작하거나 출력을 변수에 할당할 수 있는 방식으로 디렉토리에 있는 파일 목록을 빠르게 작성할 수 있습니다.
Get-ChildItem은 파이프라인을 통해, -Path 매개변수를 사용하여 또는 cmdlet 이름 바로 뒤에 경로를 제공하는 방식으로 간단히 사용할 수 있습니다 . Get-ChildItem에서 반환된 응답을 조정하려면 cmdlet에서 제공하는 일부 매개변수를 고려해야 합니다.
-Filter 매개변수 는 파일을 검색할 수 있는 한 가지 방법입니다. 기본적으로 Get-ChildItem은 대상 디렉토리의 직계 자식만 반환합니다. 이 기능은 추가 옵션인 -Recurse 를 사용하여 확장할 수 있으며 , 이 옵션은 현재 디렉토리에 포함된 디렉토리를 재귀적으로 검색합니다.
PowerShell 4.0에서 Get-ChildItem은 –File 또는 –Directory 스위치를 사용하여 결과를 파일이나 디렉터리로 제한하는 기능을 추가했습니다 . 이전 버전의 PowerShell에서는 결과를 Where-Object에 전달하고 PSIsContainer 속성을 필터링하여 이를 결정해야 했습니다. C:Users에 포함된 폴더를 반환하는 데 사용된 두 가지 기술의 예는 다음과 같습니다.
Get-ChildItem C:Users -Directory Get-ChildItem C:Users | Where-Object {$_.PSIsContainer –eq $true}
숨겨진 파일이나 시스템 파일을 감지하려면 -Force를 사용해야 합니다 . PowerShell 4.0 이상에서 Get-ChildItem을 사용하면 -Hidden, -ReadOnly 및 –System을 각각 사용하여 숨겨진 파일, 읽기 전용 파일 또는 시스템 파일만 반환할 수도 있습니다. 이전 버전에서는 Where-Object를 사용하여 Mode 속성을 필터링하여 유사한 기능을 얻을 수 있었습니다.
Get-ChildItem C:Users | Where-Object {$_.Mode -like '*R*'}
파일이 존재하는지 확인하세요
일반적으로 파일을 다룰 때 우리가 알아야 할 것은 해당 파일이 존재하는지, 디렉토리 경로가 유효한지 여부뿐입니다. PowerShell은 Test-Path 형태로 이를 수행하는 cmdlet을 제공하는데, 이는 true 또는 false 값을 반환합니다.
Test-Path는 특정 파일을 복사하거나 삭제하기 전에 예방 조치로 사용됩니다.
파일 복사, 이동 및 삭제
Copy-Item: -Path 매개변수로 지정된 위치에서 하나 이상의 파일이나 디렉토리를 -Destination 옵션으로 지정된 위치로 복사합니다.
항목 이동: 파일이나 폴더를 이동합니다.
디렉토리 구조를 복사하거나 이동하는 경우 -Recurse를 사용하여 cmdlet이 디렉토리와 그 내용에 대한 작업을 수행하도록 해야 합니다. 어떤 경우에는 -Force가 필요합니다 . 예를 들어 복사 작업으로 읽기 전용 파일을 덮어쓸 때입니다.
Remove-Item: 파일, 폴더를 삭제합니다.
읽기 전용 파일을 발견하면 -Force 스위치를 사용해야 하고, 디렉토리와 그 내용을 삭제할 때는 -Recurse 스위치를 사용해야 합니다.
PowerShell -WhatIf 및 -Confirm 사용
심각한 대량 삭제를 수행하기 전에 -WhatIf 를 사용하세요 . -WhatIf를 사용하면 스크립트나 명령을 실행하면 어떤 일이 발생하는지, 중요한 비즈니스 데이터가 삭제되는 등 잠재적으로 부정적인 영향이 있는지 확인할 수 있습니다. -WhatIf는 파일 작업에만 국한되지 않고 PowerShell에서도 널리 사용된다는 점도 주목할 만합니다.
수동으로 실행하려는 스크립트나, 더 나쁜 경우 수동으로 실행되는 종속 명령이 있는 경우 -Confirm을 사용하는 것이 좋습니다 . 이를 통해 작업이 실제로 수행되기 전에 사용자 상호 작용을 요청할 수 있습니다.
PowerShell 스크립트 = 스테로이드를 첨가한 배치 파일
PowerShell 자체는 .NET 언어로 작성되었으며 .NET Framework를 기반으로 합니다. 이것이 PowerShell이 객체 지향 유틸리티이자 스크립팅 언어로 설계된 이유입니다. PowerShell의 모든 항목은 완벽하게 기능하는 .NET Framework 개체로 처리됩니다. 해당 개체 유형의 속성과 메서드를 사용하여 사용할 수 있는 개체 집합을 제공하는 명령입니다. 한 명령의 출력을 다른 명령으로 파이프로 전달하려는 경우 PowerShell은 첫 번째 명령줄의 텍스트 출력만이 아니라 실제로 객체를 전달합니다. 이렇게 하면 다음 명령은 파이프라인에 있는 개체의 모든 속성과 메서드에 대한 전체 액세스 권한을 얻습니다.
모든 것을 객체로 취급하고 명령 간에 객체를 수용할 수 있는 기능은 명령줄 유틸리티에 있어서 큰 이론적 변화입니다. 그럼에도 불구하고 PowerShell은 여전히 기존 셸 유틸리티처럼 작동합니다. 명령어, 스크립트, 실행 파일을 명령줄에 입력하고 실행할 수 있으며, 결과는 텍스트 형식으로 표시됩니다. CMD.EXE 내에서 실행되는 Windows .CMD 및 .BAT 파일, VBScript, JScript 및 실행 파일은 모두 PowerShell에서 실행됩니다. 하지만 객체 지향적이지 않기 때문에 PowerShell에서 생성되고 사용되는 개체에 대한 전체 액세스 권한은 없습니다. 이러한 레거시 스크립트와 실행은 여전히 모든 것을 텍스트로 처리하지만 PowerShell을 여러 다른 기술과 결합할 수 있습니다. 한 번에 모두 변환할 수 없는 기존 스크립트 모음으로 PowerShell을 사용하려는 경우 이 점은 매우 중요합니다.
Cmdlet은 매개변수를 받아 동작을 변경할 수 있습니다. Cmdlet이나 함수를 실행할 때 매개변수 값을 제공하여 각 PowerShell 명령이 언제, 어디서, 어떻게 실행되는지 지정할 수 있습니다.
예를 들어, Get-Process는 운영 체제에서 실행 중인 모든 프로세스를 검색하여 나열합니다.
하지만 특정한 수준의 진전만 원한다면 어떻게 해야 할까요? 매개변수를 사용하여 이를 수행할 수 있습니다. 예를 들어, 모든 Slack 프로세스를 가져오려면 Get-Process Cmdlet과 함께 Name 매개변수를 사용할 수 있습니다.
Get-Process -Name Slack
그러면 "slack"이라는 이름의 프로세스만 볼 수 있습니다.
팁 : 일부 매개변수는 "위치적"이므로 이름이 선택 사항입니다. 이 경우 Get-Process -Name Slack 과 Get-Process Slack은 모두 동일한 작업을 수행합니다.
각 Cmdlet은 서로 다른 유형의 매개변수를 허용합니다. Get-Help 명령을 사용하여 SYNTAX 섹션에서 Cmdlet의 허용된 매개변수를 확인하세요.
Get-Help Get-Process
주어진 Cmdlet을 실행할 수 있는 모든 가능한 방법 목록이 표시됩니다.
이 경우 Get-Process Cmdlet은 Name, Id, ComputerName, Module, FileVersionInfo 및 기타 일반 매개변수와 같은 매개변수를 허용합니다. 여기에 있는 기호의 의미는 다음과 같습니다.
|
상징 |
이름 |
의미 |
|---|---|---|
|
북 |
매개변수가 입력을 허용하지 않습니다 |
|
|
- |
하이픈 |
매개변수 이름 지정 |
|
<> |
중괄호 |
텍스트 자리 표시자 |
|
[] |
괄호 |
매개변수는 하나 이상의 값을 받을 수 있습니다. |
|
{} |
중괄호 |
매개변수는 일련의 값을 허용합니다. |
매개변수는 문자열, 정수, 부울 또는 DateTime과 같이 필요한 데이터 유형을 나타내는 값 집합을 허용합니다. 예를 들어, 다음 명령은 다음과 같습니다.
Get-Process [[-Name] ]
... Name 매개변수는 하나 이상의 문자열 값을 허용하는 반면, 이 명령은 다음과 같습니다.
Get-Process -Id
...는 Id 매개변수가 하나 이상의 정수 값을 허용한다는 것을 의미합니다.
이전 Get-Process 예제에서는 Name 매개변수를 사용하여 결과를 좁혔습니다. 하지만 더 구체적인 프로세스로 범위를 좁히고 싶다면 ID 매개변수를 사용할 수 있는데 , 이 매개변수는 구문에 명시된 대로 정수를 필요로 합니다.
Get-Process -Id 3016
그러면 목록에 하나의 프로세스만 표시됩니다.
PowerShell은 모든 데이터를 개체로 취급합니다. 스크립트를 작성하려면 이러한 객체가 파이프 기호(|)로 연결된 일련의 Cmdlet이나 함수를 거쳐야 합니다. 효율적인 스크립트를 위해서는 올바른 Cmdlet을 선택하고 파이프라인을 사용하여 논리적 순서로 연결하는 것이 중요합니다.
폴더에서 가장 많은 공간을 차지하는 상위 5개 파일을 정렬하여 표시하는 스크립트를 만든다고 가정해 보겠습니다. 파일 정렬 스크립트를 만드는 더 강력한 방법이 있지만, 다음의 간단한 방법은 이해하기 쉽습니다.
PowerShell에서 이 작업을 수행하려면 다음과 같은 파이프라인을 사용하세요.
Get-ChildItem -Path "C:\Directory" -File | Sort-Object Length -Descending `
| Select-Object -First 5 | Format-Table Name, Length -AutoSize
이제 작동하는 파이프라인이 있으므로 이를 PS1 스크립트 파일로 저장하면 사용할 때마다 가져올 필요가 없습니다.
PS1 파일을 만드는 가장 간단한 방법은 스크립트를 메모장에 붙여넣고 파일을 .ps1 확장자로 저장하는 것입니다.
PS1 파일을 생성하면 ./ScriptName.ps1을 실행하여 PowerShell에서 사용할 수 있습니다 .
팁 : 권한 오류가 발생하는 경우 가장 빠른 해결 방법은 스크립트를 실행할 때 관리자 권한으로 PowerShell을 실행하는 것입니다.
축하해요! 이제 PowerShell PS1 스크립트를 만들 수 있습니다.
새로운 기술의 경이로움을 읽고 이해하는 것은 하나의 일이지만, 실제로 그것을 사용하는 것은 또 다른 일입니다! 이 문서의 나머지 부분에서는 PowerShell 스크립트를 개발하여 해당 기능과 사용법을 보여드리겠습니다.
DIR은 CMD.EXE에서 가장 흔한 명령어 중 하나입니다 . 이 명령어는 상위 디렉토리에 포함된 모든 파일과 하위 디렉토리를 보여줍니다(그림 1 참조). 각 객체의 이름과 함께 제공되는 정보에는 마지막 업데이트 날짜 및 시간, 각 파일의 크기도 포함됩니다. DIR은 디렉토리에 있는 모든 파일의 총 크기를 표시할 뿐만 아니라, 전체 파일 수와 전체 하위 디렉토리 수도 표시합니다.

그림 1
PowerShell에서 DIR을 실행해도 그림 2와 같은 디렉터리 목록이 생성되지만 약간 다릅니다. PowerShell에는 DIR 명령이 없지만 대신 동일한 기능을 수행하는 Get-ChildItem이 있습니다. PowerShell에서 DIR은 Get-ChildItem의 별칭입니다. 이 글에서는 별칭에 대해 이야기할 생각이 없습니다. PowerShell에서 DIR은 Get-ChildItem의 약자라고 생각하면 됩니다.
PowerShell의 DIR은 위에서 언급한 것과 거의 동일한 정보를 제공합니다. 즉, 파일 및 폴더 목록, 마지막으로 업데이트된 날짜 및 시간, 각 파일의 크기입니다. 하지만 CMD.EXE의 DIR이 제공하는 요약 정보, 즉 디렉토리에 있는 모든 파일의 총 크기, 총 파일 수, 총 하위 디렉토리 수 등이 부족합니다.

그림 2
예시 시나리오에서는 CMD.EXE DIR 명령을 시뮬레이션하는 PowerShell 스크립트를 만들어야 합니다. 아래에서는 대본의 가장 필수적인 부분을 설명하겠습니다.
DIR.PS1: 헤더
PowerShell 스크립트는 .PS1 확장자를 가진 일반 텍스트 파일에 PowerShell 명령 으로 구성됩니다. DIR 대신 DIR.PS1이라는 텍스트 파일을 사용합니다.
스크립트를 실행하려면 PowerShell 화면에 다음 명령을 입력하세요.
.DIR.PS1 X:Folder
여기서 X는 드라이브 파티션 문자(예: C, D, E)이고 폴더는 폴더 이름입니다.
드라이브 파티션에 대한 정보를 알고 싶다면 Windows Management Instrumentation(WMI)을 사용해야 합니다. WMI에 대한 세부 사항은 이 문서의 범위를 벗어나므로 여기서는 다루지 않습니다. 하지만 아래의 PowerShell 코드는 WMI의 도움 없이도 충분히 이해할 수 있습니다. Get-WmiObject 명령과 함께 사용할 "$filter" 변수를 만들 수 있습니다. 이 필터 변수는 Get-WmiObject 명령에 특정 드라이브에 대한 정보만 원한다는 것을 알려줍니다. Get-WmiObject 명령의 결과는 $volInfo라는 변수에 저장됩니다. PowerShell에서는 모든 것이 객체라는 점을 기억하세요. $volInfo는 이제 Get-WmiObject에서 반환되는 결과 개체이기도 합니다.
$filter = "DeviceID = '" + $drive + ":'"
$volInfo = Get-WmiObject -Class Win32_LogicalDisk -Filter $filter
이제 해당 객체와 연관된 모든 객체와 메서드에 액세스할 수 있습니다. 볼륨 일련 번호는 VolumeSerialNumber 속성을 통해 액세스할 수 있습니다. 반환된 정보는 8자리 문자열입니다. 하지만 일반적으로 하이픈으로 구분된 4개의 개별 숫자로 형식을 지정합니다. 아래 줄과 비슷하게 할 수 있습니다. 첫 번째 줄의 끝에 있는 하이픈은 PowerShell의 줄 연속 문자입니다. 기본적으로 PowerShell에 줄이 끊어지지 않았지만 다음 줄이 포함되어 있음을 알려줍니다. 코드를 작성할 때 줄을 구분할 필요는 없지만, 너비를 줄이고 코드의 가독성을 높이기 위해 줄을 구분해야 합니다.
$serial = $volInfo.VolumeSerialNumber.SubString(0, 4) + "-" + `
$volInfo.VolumeSerialNumber.SubString(4, 4)
이제 $volInfo 개체가 있으므로 DIR 헤더 정보를 화면에 쓸 수 있습니다. 드라이브에 이름이 없으면 화면에 쓰여지는 텍스트는 드라이브��� 이름이 있는 경우와 약간 다릅니다. 간단한 If-Else 문은 VolumeName 속성이 빈 문자열인지 아닌지 확인하는 데 사용됩니다. Write-Host 명령은 개별 명령줄을 화면에 쓰는 데 사용됩니다.
If ($volInfo.VolumeName -eq "") { Write-Host (" Volume in drive " + $drive + " has no label") } Else { Write-Host (" Volume in drive " + $drive + " is " + $volInfo.VolumeName) } Write-Host (" Volume Serial Number is " + $serial) Write-Host ("`n Directory of " + $args[0] + "`n")
Write-Host 명령의 시작과 끝에 있는 " `n " 문자는 텍스트 앞과 뒤에 새 줄을 삽입하는 데 사용됩니다. Write-Host 명령은 각 줄의 끝에 새 줄을 추가합니다. 따라서 " `n "의 효과는 텍스트 줄의 앞과 뒤에 빈 줄을 만드는 것입니다.
If 명령어에서 "-eq"를 눈여겨보셨나요? 이는 동등 비교 연산자입니다. 아래 표에서는 모든 비교 연산자를 보여줍니다.
| -eq, -ieq | 비교하다 |
| -ne, -ine | 비교는 동일하지 않습니다 |
| -gt, -igt | 보다 큰 것을 비교하다 |
| -게, -이게 | 보다 크거나 같음을 비교하다 |
| -lt, -ilt | 보다 작은 것을 비교하세요 |
| -le, -ile | 이하와 비교하다 |
비교 연산자 앞에 -i 문자를 붙이면 해당 연산자가 대소문자를 구분하지 않음을 나타냅니다.

그림 3: 현재 가지고 있는 스크립트의 출력 데이터
DIR.PS1: 파일/폴더 목록
이제 이 폴더의 내용과 속성을 표시할 준비가 되었습니다. 가장 먼저 해야 할 일은 PowerShell Get-ChildItem 명령을 호출하여 파일 세트를 가져와 스크립트에 매개변수로 전달하는 것입니다. Get-ChildItem 명령은 파일 및 폴더 개체의 컬렉션을 검색합니다. 개체의 이름뿐만 아니라 이러한 개체를 Sort-Object 명령으로 직접 파이프하여 정렬합니다. 기본적으로 Sort-Object 명령은 Name 속성을 기준으로 개체를 정렬합니다. 그러니 다른 매개변수를 설명할 필요가 없습니다. 정렬된 객체 세트는 $items라는 변수에 저장됩니다.
$items = Get-ChildItem $args[0] | Sort-Object
파일과 폴더 객체를 모아 놓았다면 이를 순환하여 적절한 기능을 표시해야 합니다. 이 작업에 사용되는 명령은 ForEach입니다. 각 파일이나 폴더에 대해 표시되는 특징은 마지막 업데이트 날짜와 시간, 이름, 길이 또는 파일 크기입니다. 괄호 안에 있는 이상하게 생긴 문자열은 .NET 문자열 형식 코드입니다. 필드를 왼쪽/오른쪽 정렬하고 날짜, 시간, 숫자의 형식을 지정하는 데 사용됩니다. 이러한 문자열 형식 코드를 이해하는 것은 그다지 중요하지 않습니다. 이 스크립트의 특성에 필수적인 것은 아니기 때문입니다.
If 명령은 객체가 디렉토리인지 아닌지를 판별하는 명령입니다. Mode 속성의 첫 번째 문자가 "d"이면 해당 객체는 디렉토리입니다. 디렉토리용으로 작성된 코드는 파일용으로 작성된 코드와 다른 경우가 많으므로 두 번 확인해야 합니다.
If 문 내부의 $totalDirs++ 줄에 주목하세요. 이는 폴더의 개수를 추적하는 카운터입니다. 마찬가지로, 모든 파일의 총 크기를 추적하는 데 사용되는 $totalFiles 변수가 있습니다. 이러한 값은 항상 실행 중에 계산됩니다. 하지만 파일 나열 프로세스가 완료된 후에만 표시됩니다.
ForEach ($i In $items)
{
$date = "{0, -20:MM/dd/yyyy hh:mm tt}" -f $i.LastWriteTime
$file = $i.Name
If ($i.Mode.SubString(0, 1) -eq "d")
{
$totalDirs++
$list = $date + " {0, -15}" -f "
" + " " + $file
}
Else
{
$totalFiles++
$size = "{0, 18:N0}" -f $i.Length
$list = $date + $size + " " + $file
}
$totalSize += $i.Length
Write-Host $list
}

그림 4: 업데이트된 스크립트의 출력 데이터를 표시합니다.
DIR.PS1: 바닥글
이제 해야 할 일은 이 드라이브 파티션에 있는 총 파일 수, 폴더 수, 모든 파일의 총 크기, 여유 공간을 화면에 쓰는 것뿐입니다. 이렇게 하려면 이전 섹션에서 만든 카운터 변수($totalFiles, $totalDirs, $totalSize)를 사용해야 합니다. 스크립트 시작 부분에서 생성된 $volInfo 변수를 통해 얼마나 많은 여유 공간이 있는지 확인할 수 있습니다.
Write-Host ("{0, 16:N0}" -f $totalFiles + " File(s)" + `
"{0, 15:N0}" -f $totalSize + " bytes")
Write-Host ("{0, 16:N0}" -f $totalDirs + " Dir(s)" + `
"{0, 16:N0}" -f $volInfo.FreeSpace + " bytes free`n")

그림 5: 스크립트의 전체 출력 데이터를 표시합니다.
예측 및 개선이 가능합니다.
작성한 스크립트는 CMD.EXE DIR 명령과 거의 동일한 출력을 생성하지만, 알아두어야 할 몇 가지 주의 사항과 개선할 수 있는 부분이 있습니다.
PowerShell을 사용하면 일관성을 위해 파일 이름을 일괄 변경하거나 애플리케이션을 자동으로 시작하는 등 거의 모든 작업을 자동화할 수 있습니다. 간단한 Windows PowerShell 스크립트를 작성하여 작동 방식을 살펴보겠습니다.
참고 : 실행 정책과 관련된 스크립트를 실행할 때 오류가 발생하는 경우 "Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass"를 실행하여 스크립트가 일시적으로 실행되도록 허용해야 할 수 있습니다.
폴더의 파일 이름 일괄 변경
PowerShell을 사용하여 PC에서 파일을 복사, 이동, 삭제할 수 있습니다. 특정 파일 유형의 파일 이름을 일괄적으로 바꿀 수도 있습니다. 예를 들어, 다음은 파일 이름에서 접두사 "oldco"를 "newco"로 바꿔서 여러 텍스트 파일의 이름을 바꾸는 방법입니다.
Get-ChildItem -Path "C:\CompanyFiles" -Filter "*.txt" | Rename-Item -NewName {$_.Name -replace "oldco","newco"}
위 스크립트에서 ".txt"는 파일 확장자 필터입니다. .jpg, .docx 등으로 수정하고 설정하여 다양한 파일 형식을 검색할 수 있습니다.
자동 실행 애플리케이션
매일 동일한 애플리케이션 세트를 여는 경우 PowerShell 스크립트를 작성하여 한 번의 클릭으로 해당 애플리케이션을 실행할 수 있습니다.
#Open multiple apps with a single click
Start-Process "notepad.exe"
Start-Process "calc.exe"
Start-Process "Chrome.exe"
Start-Process "slack.exe"
스크립트를 메모장 파일에 붙여넣고 LaunchFavoriteApps.ps1이라는 이름으로 저장합니다. 그런 다음, 스크립트에 나열된 모든 애플리케이션을 실행하려면 파일을 두 번 클릭하기만 하면 됩니다.
중요한 파일을 백업 위치로 복사하세요
다음 스크립트를 사용하면 중요한 파일을 주기적으로 백업 위치에 백업할 수 있습니다. 필요에 따라 소스 및 대상 경로를 변경하세요.
#Copy MyFiles folder contents to MyFilesBackup in D:\
Copy-Item -Path "C:\Documents\MyFiles" -Destination "D:\MyFilesBackup" -Recurse
매일 다양한 유형의 파일이 다운로드되기 때문에 다운로드 폴더는 여기저기에 흩어져 있는 온갖 종류의 파일로 인해 금세 어수선해질 수 있습니다. 이 문제를 해결하려면 매일 작업이 끝나면 다운로드한 파일을 파일 유형별로 폴더에 정렬하는 PowerShell 스크립트를 작성하면 됩니다.
새로운 메모장 파일을 열고 다음 스크립트를 붙여넣습니다. 스크립트에서 소스 폴더 경로를 다운로드 폴더 경로와 일치하도록 변경하세요.
# Change the source folder path below
$sourcePath = "E:\Downloads"
# Add file mapping folder names; the Others folder includes all the files that do not match file types in the other categories
$fileTypes = @{
"Documents" = @("*.docx", "*.pdf", "*.txt")
"Images" = @("*.jpg", "*.png", "*.gif")
"Media" = @("*.mp4", "*.mp3", "*.mov")
"Zip" = @("*.zip", "*.rar")
"ISO" = @("*.iso")
"Others" = @("*")
}
# Iterate through each folder type and prepare a destination folder for organizing files
foreach ($folder in $fileTypes.Keys) {
# Create the destination folder path
$destPath = Join-Path -Path $sourcePath -ChildPath $folder
# Check if the destination folder exists, and create it if it doesn't
if (!(Test-Path -Path $destPath)) {
New-Item -ItemType Directory -Path $destPath | Out-Null
}
# Move matching files from the source folder to the destination folder based on file type patterns
foreach ($pattern in $fileTypes[$folder]) {
Get-ChildItem -Path $sourcePath -Filter $pattern -File -ErrorAction SilentlyContinue | ForEach-Object {
try {
Move-Item -Path $_.FullName -Destination $destPath -Force -ErrorAction Stop
Write-Output "Moved: $($_.FullName) to $destPath"
} catch {
Write-Warning "Failed to move file: $($_.FullName). Error: $_"
}
}
}
}
Write-Output "Files organized successfully!"
파일을 저장하려면 파일 > 다른 이름으로 저장을 클릭하고 파일 이름으로 OrganizeDownloadsFolder.ps1을 입력합니다 . 그런 다음 파일 형식을 클릭 하고 모든 파일을 선택합니다 . OrganizeDownloadsFolder.ps1 파일을 두 번 클릭하여 스크립트를 실행합니다.
물론 스크립팅은 자동화 프로세스의 일부입니다. 두 번째 부분은 스크립트가 자동으로 실행되어 작업을 수행할 수 있는지 확인하는 것입니다. 이를 위해 매일 또는 필요에 따라 스크립트를 실행하는 예약된 작업을 만들 수 있습니다.
PowerShell을 열고 다음 스크립트를 복사하여 붙여넣은 다음 Enter 키를 누릅니다 . 'J:\OrganizeDownloadsFolder.ps1'을 OrganizeDownloadsFolder.ps1 스크립트 의 전체 파일 경로로 바꿔야 합니다 .
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File 'J:\OrganizeDownloadsFolder.ps1'"
$trigger = New-ScheduledTaskTrigger -Daily -At "5:00 PM"
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "OrganizeDownloadsFolderDaily"
완료되면 Enter 키를 누르세요 . 스크립트는 작업 스케줄러에 예약된 작업을 생성하여 매일 오후 5시에 파일 정리 스크립트를 실행합니다. 다른 시간을 원하시면 위의 스크립트에서 수정하실 수 있습니다.
또한 PowerShell을 사용하면 기본 드라이브의 여유 공간이 부족할 때 알림을 보내는 공간 모니터링 스크립트, PDF 문서 일괄 처리에 암호 보호, 이미지 폴더에서 라이브 배경 화면 적용 등 일상적인 작업을 자동화할 수 있습니다.
PowerShell은 강력한 스크립팅 언어이자 유틸리티이지만, 특히 .NET Framework 환경에 익숙하지 않은 경우 이해하고 사용하는 데 시간이 많이 걸리지 않습니다. PowerShell을 이해하고자 하는 모든 사람에게 이 문서와 예제 스크립트가 유용하기를 바랍니다. 하지만 예제에서 만든 스크립트는 매우 간단합니다. 더욱 복잡한 애플리케이션에 더 잘 사용할 수 있도록 더욱 완벽하게 구축하고 개발할 수 있다고 믿습니다.
이 글에서는 하드 드라이브에 문제가 생겼을 때 다시 접근할 수 있는 방법을 안내해 드리겠습니다. 함께 따라 해 보세요!
AirPods는 언뜻 보기에 다른 무선 이어폰과 별반 다르지 않아 보입니다. 하지만 몇 가지 잘 알려지지 않은 기능이 발견되면서 모든 것이 달라졌습니다.
Apple은 iOS 26을 출시했습니다. 완전히 새로운 불투명 유리 디자인, 더욱 스마트해진 경험, 익숙한 앱의 개선 사항이 포함된 주요 업데이트입니다.
학생들은 학업을 위해 특정 유형의 노트북이 필요합니다. 선택한 전공 분야에서 뛰어난 성능을 발휘할 만큼 강력해야 할 뿐만 아니라, 하루 종일 휴대할 수 있을 만큼 작고 가벼워야 합니다.
Windows 10에 프린터를 추가하는 것은 간단하지만, 유선 장치의 경우와 무선 장치의 경우 프로세스가 다릅니다.
아시다시피 RAM은 컴퓨터에서 매우 중요한 하드웨어 부품으로, 데이터 처리를 위한 메모리 역할을 하며 노트북이나 PC의 속도를 결정하는 요소입니다. 아래 글에서는 WebTech360에서 Windows에서 소프트웨어를 사용하여 RAM 오류를 확인하는 몇 가지 방법을 소개합니다.
스마트 TV는 정말로 세상을 휩쓸었습니다. 이렇게 많은 뛰어난 기능과 인터넷 연결 덕분에 기술은 우리가 TV를 시청하는 방식을 바꾸어 놓았습니다.
냉장고는 가정에서 흔히 볼 수 있는 가전제품이다. 냉장고는 보통 2개의 칸으로 구성되어 있는데, 냉장실은 넓고 사용자가 열 때마다 자동으로 켜지는 조명이 있는 반면, 냉동실은 좁고 조명이 없습니다.
Wi-Fi 네트워크는 라우터, 대역폭, 간섭 외에도 여러 요인의 영향을 받지만 네트워크를 강화하는 몇 가지 스마트한 방법이 있습니다.
휴대폰에서 안정적인 iOS 16으로 돌아가려면 iOS 17을 제거하고 iOS 17에서 16으로 다운그레이드하는 기본 가이드는 다음과 같습니다.
요거트는 정말 좋은 음식이에요. 매일 요구르트를 먹는 것이 좋은가요? 매일 요구르트를 먹으면, 몸에 어떤 변화가 있을까요? 함께 알아보죠!
이 기사에서는 가장 영양가 있는 쌀 종류와 어떤 쌀을 선택하든 건강상의 이점을 극대화하는 방법에 대해 설명합니다.
수면 일정과 취침 루틴을 정하고, 알람 시계를 바꾸고, 식단을 조절하는 것은 더 나은 수면을 취하고 아침에 제때 일어나는 데 도움이 되는 몇 가지 방법입니다.
임대해 주세요! Landlord Sim은 iOS와 Android에서 플레이할 수 있는 모바일 시뮬레이션 게임입니다. 여러분은 아파트 단지의 집주인 역할을 하며 아파트 내부를 업그레이드하고 세입자가 입주할 수 있도록 준비하여 임대를 시작하게 됩니다.
욕실 타워 디펜스 Roblox 게임 코드를 받고 신나는 보상을 받으세요. 이들은 더 높은 데미지를 지닌 타워를 업그레이드하거나 잠금 해제하는 데 도움이 됩니다.