2010. 11. 9. 17:58

안녕하세요. 엉스데브 입니다.

이번에는 PowerShell 을 이용해서 대량의 파일을 대상으로 내부 내용을 변경 하는 방법을 찾아 보았습니다.

PowerShell 에는 -replace 연산자가 존재하는데, 마치 리눅스의 sed 명령어 처럼 쓸 수 있습니다.

"wow nice olleh" | %{$_ -Replace ("nice","OLLEH")}




이 연산자를 사용해서 대량의 파일을 대상으로 내용을 변경 하는 것도 가능 한데요, 아래의 구조로 된 폴더를 예로 들겠습니다.


폴더의 내부에 존재하는 각 파일의 내용에는 nice 라는 문자열이 존재합니다.



만약, "MyDocument" 디렉터리및 하위 디렉터리의 모든 *.txt 파일을 대상으로 파일 내용 중 "nice" 를 "OLLEH" 라고 바꾸고 싶다면, 아래 명령어를 사용하면 됩니다.

dir -Path MyDocument -Include *.txt -Recurse | %{$tmp = Get-Content $_; $tmp=$tmp -Replace ("nice","OLLEH"); Set-Content $_ $tmp}


파일의 내용 중 nice 가 모두 OLLEH 로 변경 된 것을 확인 할 수 있습니다.

대량 변경 작업시에 유용하게 사용 할 수 있을 것 같네요. ^^



<참고 URL>
http://www.myitforum.com/articles/40/view.asp?id=11843
http://blogs.msdn.com/b/zainnab/archive/2007/07/09/grep-and-sed-with-powershell.aspx

<참고 도움말>
about_Comparison_Operators

감사합니다.
Posted by 알 수 없는 사용자
:
2010. 10. 26. 14:12

안녕하세요. 엉스데브 입니다.

오늘은 자작 함수 및 스크립트에 대한 도움말을 작성하는 방법에 대해 알아보겠습니다.

PowerShell 은 Get-Help 라는 도움말 출력 전용 cmdlet 을 제공 합니다.
Get-Help cmdlet 에 자기가 실행하고자 하는 명령어를 지정하면 해당 명령어에 맞는 도움말을 보여주는데요.

PowerShell 에 기본 내장 된 명령어 뿐만 아니라, 직접 만든 함수/스크립트도 Get-Help 를 통해 도움말을 볼 수 있습니다.
다만, 이게 가능하려면 함수/스크립트 작성 시, 주석에 지정된 키워드 및 특정 형식을 지켜서 도움말에 표시 될 내용을 미리 적어 두어야 합니다.

다음은 간단한 도움말을 작성한 함수의 예 입니다.

Function Test-Role
{
<#
.Synopsis
현재 세션의 역할이 지정한 역할에 포함되어 있는지 확인 합니다.

.Description
현재 세션의 역할이 지정한 역할에 포함되어 있는지 확인 합니다. Role 파라미터에 Administrator 를 주면 현재 세션이 관리자 권한이 있는지 확인하는 용도로 사용 할 수 있습니다.

.Parameter Role
System.String 윈도우 내장 역할을 의미하는 문자열 입니다. 다음 9가지 값 중 선택 가능 합니다.
Administrators, User, Guest, PowerUser, AccountOperator, SystemOperator, PrintOperator, BackupOperator, Replicator

.Example
Test-Role Administrator
False

설명
-----------
현재 세션이 관리자 권한이 아닌 것을 알 수 있습니다.

.Example
Test-Role User
True

설명
-----------
현재 세션이 유저 권한을 가지고 있음을 알 수 있습니다.

.Link
http://svrstudy.tistory.com/26
#>

  Param( [Security.Principal.WindowsBuiltinRole]$Role )

  $CurrentUser = [Security.Principal.WindowsPrincipal]([Security.Principal.WindowsIdentity]::GetCurrent())

  $CurrentUser.IsInRole($Role)
}

도움말 키워드는 . 으로 시작하게 되며, 키워드에 대한 설명은 바로 다음줄 부터 입니다.
설명의 범위는 다른 키워드를 만나거나, 주석이 끝날 때 까지 입니다.

이 예제 함수에 대해 Get-Help 명령어를 실행 하면, 아래와 같이 표시 됩니다.

@Get-Help Test-Role


@Get-Help Test-Role -detailed


다음은 자주 사용되는 도움말용 키워드 목록 및 간단한 설명입니다.

1. Synopsis - 개요
: 함수나 스크립트에 대한 간단한 설명입니다.

2. Description - 설명
: 함수나 스크립트에 대한 자세한 설명입니다

3. Parameter - 매개 변수
: 매개 변수에 대한 설명입니다. 키워드를 적고 바로 뒤에 파라미터 명을 적으시면 됩니다.

4. Example - 예
: 함수나 스크립트를 사용하는 샘플 명령이며, 그 뒤에 샘플 출력과 설명이 올 수 있습니다. 여러개의 예제가 있을 경우, 반복해서 사용하면 됩니다.

5. Link - 관련 링크
: 관련 항목의 이름, 혹은 웹문서의 주소를 지정 할 수 있습니다. 웹 문서를 지정 하는 경우, 반드시 http:// 또는 https:// 로 시작 해야 합니다.


@맺음말:
아무리 잘 만든 함수나 스크립트라도 적절한 설명 혹은 도움말이 없으면, 다른 사람들에게는 도움이 되지 않습니다.
함수나 스크립트에 도움말을 잘 작성 해 두면, 다른 사람이 좀 더 손쉽게 사용 할 수 있게 되어 환영 받고, 더 많이 사용 될 것입니다.

자신이 만든 PowerShell 함수 혹은 스크립트에 도움말을 작성해서, 생명력을 불어넣어 주세요. ^^

감사합니다.

<참고 문서>
about_Comment_Based_Help

Posted by 알 수 없는 사용자
:
2010. 10. 5. 17:59

안녕하세요. 엉스데브 입니다.

이번에는 원격 서버에 파워쉘로 연결하는 방법에 대해 알아보았습니다.

Windows 2008 R2, Windows 7 부터는 기본적으로 PowerShell 원격 작업이 가능하도록 되어있습니다.
다만, 원격 연결을 설정하고 실행 하려면 원격 컴퓨터의 관리자(Administrators) 그룹의 권한이 필요하며,
로컬 서버에서 원격 서버에 연결 혹은 명령어를 실행 할 때 항상 이 권한을 가진 자격증명을 제공해 주어야 합니다.

1. 원격 서버 설정하기.
먼저 원격 기능을 사용할 수 있도록 원격 서버 설정을 변경 해 주어야 합니다.
PowerShell 2.0 부터는 이 설정 변경 작업을 간편하게 할 수 있는 cmdlet 을 기본 제공 합니다.

원격 서버에서 아래의 명령어를 실행하면 됩니다.

Enable-PSRemoting


명령을 실행하면 처리하는 작업에 대한 승인여부를 물어보는데,
아무것도 묻지않고 자동으로 처리 하도록 하려면 -Force 파라미터를 추가 해 주면 됩니다.




이 명령어를 실행하면, 자동으로 여러 설정을 변경해서, 원격 연결을 받아들일 수 있는 상태로 설정 해 줍니다.
자세한 내용은 MSDN 도움말(링크)을 확인 해 보시기 바랍니다.

기본적으로 모든 IP 에서 원격 연결을 허용하게끔 설정 되는데, 해당 서버의 Administrators 그룹 권한을 가진 계정정보를 모르면 원격 연결이 불가능 하기 때문에 보안적인 문제는 크게 걱정하지 않아도 됩니다.

만약, 제한 된 IP 에서만 원격 연결이 허용 되도록 하고싶다면, 직접 방화벽 설정을 통해 조절할 수 있습니다.
PowerShell 은 WinRM 프로토콜(TCP/5985, TCP/5986)을 사용해 통신하므로, 해당 포트의 접속 가능 여부를 조작 하시면 됩니다.

2. 로컬 서버의 "신뢰할 수 있는 호스트 목록" 에 원격 서버 추가하기.
원격 서버에 접속 하려면, 로컬 서버의 "신뢰할 수 있는 호스트 목록" 에 원격 서버를 등록 해야 합니다.
로컬 서버의 "신뢰할 수 있는 호스트 목록" 을 설정하려면, 아래의 명령어를 사용하면 됩니다.

Set-Item WSMan:\localhost\Client\TrustedHosts -Value "원격서버IP 혹은 호스트네임"

이 명령어를 사용하면 WinRM 보안구성 변경 확인 여부를 물어보는데,
아무것도 묻지않고 자동으로 처리 하도록 하려면 -Force 파라미터를 추가 해 주면 됩니다.




만약 여러개의 원격 서버를 지정 하고 싶다면 각 항목을 콤마(,) 로 구분하면 됩니다.

Set-Item WSMan:\localhost\Client\TrustedHosts -Value "원격서버1, 원격서버2"




만약 새로 설정하는 것이 아니라, 기존 설정에 추가하고 싶다면 아래와 같이 하면 됩니다.

$TrustedHostsOld = (Get-Item WSMan:\localhost\Client\TrustedHosts).Value
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "$TrustedHostsOld, 원격서버IP 혹은 호스트네임"




3. 원격 서버 접속용 자격증명(Credential) 만들기.
이제 원격 서버에 접속 할 수 있는 환경 구축은 마무리 되었고, 원격 서버에 접속 할 계정에 대한 자격 증명을 만들 차례 입니다.

자격증명은 간단히 아이디/패스워드 정보 라고 이해하시면 쉽습니다.
터미널에 접속 할 때 아이디/패스워드 를 입력 하는것 처럼, PowerShell 원격 접속 시에 사용할 아이디/패스워드 정보를 특정 형식으로 저장 한 것입니다.

PowerShell에서는 이 자격증명을 변수에 넣어두어 -Credential 파라미터에 지정 해 주는 방식으로 사용 할 수 있습니다.

자격증명은 아래와 같이 만들 수 있습니다.

(방법1)
간단하게 만들 수 있는 방법입니다.
하지만, 사용자가 패스워드를 직접 입력 해 주어야 하기 때문에, 스크립트 작성 등 자동 화가 필요한 작업에는 사용하기 어렵습니다.

아래의 명령을 입력하면, 패스워드를 입력받기 위한 팝업창에 표시 됩니다.
팝업되는 창에 패스워드를 입력 해 주면, 자격증명이 만들어져 $MyCredential 변수에 저장 됩니다.

$MyCredential = Get-Credential "아이디"




(방법2)
자동화가 필요할 때 사용할 수 있는 방법입니다.
사용자에게 직접 입력을 요구하지 않고, 미리 입력 해 둔 정보를 활용해서 자격증명을 만들 수 있습니다.

먼저, 아래 명령을 사용해서, 패스워드를 변수에 저장 합니다.
아래 명령어를 실행하고 패스워드를 입력 해 주면, 입력된 패스워드를 암호화 하여
아래 스크린샷과 같이 확인 할 수 없는 상태의 문자열로 변환되어 변수에 저장 됩니다.

$MyPassword = Read-Host "Password" -AsSecureString | ConvertFrom-SecureString




자동화가 필요할 경우, 이 변수에 저장 된 문자열을 별도로 저장해 두고 추후 자격 증명을 만들때 사용하면 됩니다.

이 문자열을 사용해 자격증명을 만들려면, 아래와 같이 실행하면 됩니다.

$MyPassword = $MyPassword | ConvertTo-SecureString
$ObjectTypeName = "System.Management.Automation.PSCredential"
$MyCredential = New-Object -TypeName $ObjectTypeName -ArgumentList "아이디",$MyPassword



4. 원격 작업 하기
이제 모든 준비가 완료 되었습니다. 원격 작업을 해 봅시다.
먼저, 원격 서버에 PowerShell 로 접속 하고 싶다면, 아래의 명령을 사용하면 됩니다.

Enter-PSSession -ComputerName "원격서버IP 혹은 호스트네임" -Credential $MyCredential



만약, 원격 서버에 접속하는 것이 아니라, 원격서버에서 특정 명령어만 실행하고 싶다면, 아래와 같이 하면 됩니다.

Invoke-Command -ComputerName "원격서버IP 혹은 호스트네임" -Credential $MyCredential -Command {"실행 할 명령어"}





원격 설정이 그다지 복잡하지 않네요. 여러대의 서버가 있을 경우, 유용하게 사용 할 수 있을 것 같습니다 ^^
오늘은 여기까지 입니다. 제가 포스팅 한 내용이 도움이 되셨기를 바랍니다.

감사합니다.

Posted by 알 수 없는 사용자
:
2010. 9. 28. 15:29

안녕하세요. 엉스데브 입니다.

오늘은 PowerShell 에서 작업 한 내용을 기록하는 방법에 대해 알아보겠습니다.

작업 내용을 기록하는 것은 아주 중요한 일입니다.
하지만, 작업만 하기에도 바쁜데 별도로 기록까지 하려면 어려움이 있는게 사실이죠.
그래서 PowerShell 은 기본적으로 History 기능을 제공하며, 대단히 큰  도움이 됩니다.

하지만, History 기능은 입력한 내용만 기록 할 뿐, 출력 내용까지 기록 하지는 않습니다.
입력 및 출력까지 PowerShell 로 작업 한 모든 기록을 남기고자 한다면, Start-Transcript cmdlet 을 사용하면 됩니다.




Start-Transcript cmdlet 을 아무런 추가 파라미터 없이 실행하게 되면, 기본적으로 내문서 디렉터리에
"PowerShell_transcript.날자시간정보.txt" 형식의 이름으로 작업 내용이 기록되는 파일이 생성 됩니다.




Start-Transcript cmdlet 의 자세한 파라미터 정보를 보시려면, 아래의 더보기 를 클릭하세요.




작업 내용 기록을 종료하고 싶을 때에는 Stop-Transcript cmdlet 을 사용하거나, 그냥 PowerShell 창을 닫으면 됩니다.




Start-Transcript cmdlet 을 Profile 에 넣어서 항상 작업 기록이 남도록 해 두었습니다. 든든하네요. ^^

작업 기록이란게 남길때는 귀찮지만, 나중에 필요할때는 정말 절실한 데이터 입니다.
여러분들 모두 작업 기록을 꼭 남기셔서 차후에 유용하게 사용하실 수 있기를 바랍니다.

Posted by 알 수 없는 사용자
:
2010. 9. 27. 22:25
안녕하세요. 엉스데브 입니다.

이번엔 PowerShell 에서 이벤트 로그 저장 설정을 변경하는 방법에 대해 알아보았습니다.

PowerShell 에서 기본적으로 제공하는 cmdlet 중 하나인 Limit-EventLog 을 사용하면 됩니다.

Limit-EventLog cmdlet 을 통해 다음의 3가지 이벤트 로그 저장 설정을 변경 할 수 있습니다.
1. 최대 로그 크기
2. 최대 로그 크기에 도달 했을 때 취할 액션
3. 이벤트가 이벤트 로그 내에서 유지되어야 하는 최소 일수

먼저 현재 이벤트 로그 목록 및 설정 상태를 확인 합니다. 다음과 같이 실행하면 됩니다.
Get-EventLog -List




1. 최대 로그 크기 를 변경하려면, 다음과 같이 실행하면 됩니다.
Limit-EventLog -LogName "로그이름" -MaximumSize "로그크기"





2. 최대 로그 크기에 도달 했을 때 취할 액션을 변경하려면, 다음과 같이 실행하면 됩니다.
Limit-EventLog -LogName "로그이름" -OverFlowAction "액션"



최대 로그 크기에 도달 했을 때 취할 액션은 다음의 3가지 중 하나를 지정 가능 합니다.
- DoNotOverwrite:  기존 항목이 유지되고 새 항목이 삭제됩니다.
- OverwriteAsNeeded:  각각의 새 항목이 가장 오래된 항목을 덮어씁니다.
- OverwriteOlder:  새 이벤트가 MinimumRetentionDays 속성에 지정된 값보다 오래된 이벤트를 덮어씁니다. MinimumRetentionDays 속성에 지정된 값보다 오래된 이벤트가 없는 경우 새 이벤트가 삭제됩니다.


3. 이벤트가 이벤트 로그 내에서 유지되어야 하는 최소 일수를 변경하려면 다음과 같이 실행하면 됩니다.
반드시 최대 로그 크기에 도달 했을 때 취할 액션이 OverwriteOlder 로 지정 되어야 합니다.
Limit-EventLog -LogName "로그이름" -OverFlowAction OverwriteOlder -RetentionDays "유지일수"





헌데, 문제를 발견했습니다.
저는 이벤트 로그가 가득 찼을 때 이벤트 로그를 별도 저장 해 두고 새롭게 쌓게(아카이빙) 하고 싶었습니다만,
현재 PowerShell에서는 이렇게 설정 할 수 있는 방법을 찾을 수 없었습니다.

대신 wevtutil 이라는 커맨드라인 유틸리티를 통해 설정이 가능했습니다. 다음과 같이 실행하면 됩니다.
wevtutil sl "로그이름" /rt:true /ab:true



* 위 명령에 대한 자세한 설명을 보시려면, 아래 더보기를 클릭하세요.

wevtutil 은 Windows 2008 부터 제공되는 커맨드 라인 유틸리티로서, 새롭게 변경 된 이벤트 로그 시스템을 커맨드 라인 상에서 관리 할 수 있도록 도와 줍니다.

wevtutil 을 자세히 살펴 본 결과, PowerShell 에서는 설정 할 수 있는 모든 부분을 설정 할 수 있을 뿐만 아니라,
PowerShell 에서는 설정 할 수 없는 부분도 wevtutil 은 수정이 가능 했습니다.
현재는 PowerShell 에서 제공하는 이벤트 로그 관련 cmdlet 보다 wevtutil 가 훨씬 강력한 기능을 가지고 있다고 판단 됩니다.
PowerShell 에서도 커맨드라인 유틸리티를 자유롭게 사용 할 수 있으므로, 이벤트 로그 설정과 관련한 작업시 wevtutil 을 적극적으로 사용하는 것이 바람직 하다고 봅니다. 물론 Object 기반의 처리를 못한다는 아쉬움은 남습니다.

앞으로 PowerShell 은 더욱더 강력해져서 윈도우 시스템의 모든 부분을 다룰 수 있게 되리라 기대하고 있습니다만,
역시 아직은 아쉬운 부분이 많이 있는것 같습니다.

PowerShell 이 더 강력해 지기를 바래 봅니다.
Posted by 알 수 없는 사용자
:
2010. 9. 15. 18:10
안녕하세요. 엉스데브 입니다.

이번에는 PowerShell 로 윈도우 내장 방화벽을 다루는 방법에 대해 알아보겠습니다.

0. PowerShell 에서 내장 방화벽을 다루기 위한 방법.
PowerShell 에 내장 된 관련 명령어는 없지만, "HNetCfg.FwMgr" Com 개체를 이용해서 다룰 수 있습니다.
아래 명령어를 통해 Com 객체를 만들 수 있습니다.

$FireWallMgr = New-Object -ComObject HNetCfg.FwMgr

1. 현재 방화벽이 켜져 있는지 꺼져 있는지 확인 및 켜기/끄기.
아래 명령어로 현재 방화벽이 켜저 있는지 꺼져 있는지를 확인 할 수 있습니다.
$FireWallMgr.LocalPolicy.CurrentProfile.FirewallEnabled
리턴 값이 True 이면 켜져있는 상티이고, False 이면 꺼져있는 상태입니다.

방화벽이 켜거나 끄려면 아래와 같이 하면 됩니다.

$FireWallMgr.LocalPolicy.CurrentProfile.FirewallEnabled = $True  # 방화벽 켜기
$FireWallMgr.LocalPolicy.CurrentProfile.FirewallEnabled = $False  # 방화벽 끄기

2. 현재 방화벽 설정 조회하기
현재 열려있는 포트(룰)을 조회 하려면 다음과 같이 입력하면 됩니다.

$FireWallMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts

3. 특정 룰이 있는지 확인 및 선택하기.
만약, 21번 포트가 방화벽에서 열려있는지(여는 룰이 존재하는지) 확인 해 보려면 아래와 같이 하면 됩니다.

$FireWallMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts | Where-Object {$_.Port -eq "21"}

만약, 이름에 SNMP 라는 키워드가 포함되는 이름을 가진 룰을 찾아보려면, 아래와 같이 하면 됩니다.

$FireWallMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts | Where-Object {$_.Name -Like "*SNMP*"}

4. 룰 추가 하기.

$FireWallRule = New-Object -ComObject HNetCfg.FwOpenPort;
$FireWallRule.Name = "룰 이름"
$FireWallRule.Port = "열 포트(0-65535))"
$FireWallRule.Enabled = "활성화 여부($True or $False)"
$FireWallRule.Protocol = "프로토콜 지정. TCP 일 경우 6, UDP 일 경우 17)"

$FireWallMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Add($FireWallRule)

5. 룰 삭제하기.
만약, 이름이 Test 인 룰을 삭제하고자 한다면, 아래와 같이 하면 됩니다.

$toDeleteFireWallRule = $FireWallMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts | Where-Object {$_.Name -Like "Test"} # 룰을 선택하고,

$toDeleteFireWallRule | %{$FireWallMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts.Remove($_.Port, $_.Protocol)} #파이프로 넘겨서 삭제 메소드 호출.


6. 룰 활성화/비활성화 하기
만약, 이름에 SNMP 라는 키워드가 포함되는 이름을 가진 룰을 비활성화 하려면, 아래와 같이 하면 됩니다.

($FireWallMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts | Where-Object {$_.Name -Like "*SNMP*"}).Enabled = $False

활성화 하려면, 아래와 같이 실행 하면 됩니다.

($FireWallMgr.LocalPolicy.CurrentProfile.GloballyOpenPorts | Where-Object {$_.Name -Like "*SNMP*"}).Enabled = $True


오늘은 여기까지 입니다.

감사합니다.
Posted by 알 수 없는 사용자
:
2010. 8. 25. 17:26

안녕하세요. 엉스데브 입니다.

지난번 "PowerShell 을 통해 IIS 관리하기"(링크) 포스트를 통해 잠깐 다뤄봤던 WebAdministration 모듈을 통해
이번엔 FTP 사이트를 만들어 볼까 합니다.(Windows 2008 R2, IIS 7.5 환경 입니다.)

먼저, 파워쉘을 켜고 WebAdministration 모듈을 Import 합니다.



New-WebFtpSite cmdlet 으로 새 FTP 사이트를 만듭니다.


기본적으로 FTP SSL 설정이 무조건 SSL 연결이 필요하도록 되어 있는데, SSL 연결을 사용하지 않을 예정이므로, 변경 해 줍니다.


FTP 인증에 기본 인증(서버의 로컬 계정을 사용해서 로그인)을 사용하도록 설정 해 줍니다.


이제 FTP 에 접속 하게 할 사용자(로컬 계정)를 만들어 주고..(링크 참조)


이 사용자가 해당 FTP 사이트에 접속 권한을 가지도록 권한 부여 규칙을 설정 해 주면, FTP 사이트 만들기가 완료됩니다.


잘 접속 되는지 테스트는 아래와 같이 해 보면 됩니다.


음! 잘 되는군요. ^^

WebConfiguration 관련 cmdlet 을 사용 할 때 가장 어렵게 느껴지는 부분은 
'-Filter' 파라미터로 설정 항목의 경로를 지정 해 주는 부분인것 같습니다.

설정항목의 경로는 applicationHost.config 파일의 내용을 참고로 찾아냅니다.
applicationHost.config 파일은 IIS 의 모든 설정이 정의되어 있는 파일이며,
XML 형식의 파일이라 XML 및 XPath 에 대해 어느정도는 알고 있어야 내용을 파악 및 원하는 경로를 정확히 뽑아 낼 수 있습니다.

아래 명령어로 applicationHost.config 파일을 바로 열어 볼 수 있습니다.


오늘은 여기까지 입니다. 제가 정리한 내용이 보시는 분들께 도움이 되기를 바랍니다.

<참고 URL>
http://www.yusufozturk.info/windows-server/setting-ftp-server-authorization-with-powershell-on-iis7-5.html

Posted by 알 수 없는 사용자
:
2010. 8. 25. 13:26
안녕하세요. 엉스데브 입니다.

PowerShell 에서 zip 파일을 다루기 위한 함수를 몇개

Windows 2008 R2 서버에서 PowerShell 을 이용해 웹 사이트를 구축하는 중입니다.
헌데 소스 파일이 zip 으로 압축 되어 있어서 PowerShell 에서 zip 압축을 풀 수 있는 도구가 필요 했습니다.
구글링을 해 보니, 바로 사용할 수 있는 zip 파일 처리 함수를 몇 개 찾을 수 있었습니다. 아래에 정리 합니다.

1. zip 파일 압축 풀기.
function Extract-Zip
{
  param([string]$zipfilename, [string] $destination)

  if(test-path($zipfilename))
  { 
    $shellApplication = new-object -com shell.application
    $zipPackage = $shellApplication.NameSpace($zipfilename)
    $destinationFolder = $shellApplication.NameSpace($destination)
    $destinationFolder.CopyHere($zipPackage.Items())
  }
}
@ 사용법 : Extract-Zip C:\test\zipfile.zip c:\test\destination

2. zip 압축파일 새로 만들기.
function New-Zip
{
  param([string]$zipfilename)
  set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
  (dir $zipfilename).IsReadOnly = $false
}

3. 이미 존재하는 zip 압축 파일에 파일 추가하기.(파이프 라인 이용)
function Add-Zip
{
  param([string]$zipfilename)
 
  if(-not (test-path($zipfilename)))
  {
    set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
    (dir $zipfilename).IsReadOnly = $false 
  }
 
  $shellApplication = new-object -com shell.application
  $zipPackage = $shellApplication.NameSpace($zipfilename)
 
  foreach($file in $input)
  {
            $zipPackage.CopyHere($file.FullName)
            Start-sleep -milliseconds 500
  }
}

4. zip 파일 내부 파일 목록 확인.
function Get-Zip
{
  param([string]$zipfilename)
  if(test-path($zipfilename))
  {
    $shellApplication = new-object -com shell.application
    $zipPackage = $shellApplication.NameSpace($zipfilename)
    $zipPackage.Items() | Select Path
  }
}

잘 작동하고, 유용하게 사용하고 있습니다. 다만, 경로를 지정 할 때 상대 경로로 지정 할 경우 오류가 발생 하더군요..
전 사용하다 보니 이 부분이 좀 불편해서 아래와 같이 고쳐서 사용하고 있습니다.

# 압축 풀기.
function Extract-Zip
{
  param([string]$zipfilename, [string] $destination=".") #목적지 기본값은 현재 디렉토리

  #상대경로를 절대경로로 변경
  $zipfilename = (Get-Item $zipfilename).FullName
  $destination = (Get-Item $destination).FullName


  if(test-path($zipfilename))
  { 
    $shellApplication = new-object -com shell.application
    $zipPackage = $shellApplication.NameSpace($zipfilename)
    $destinationFolder = $shellApplication.NameSpace($destination)
    $destinationFolder.CopyHere($zipPackage.Items())
  }
}

# 압축 하기
function Add-Zip
{
  param([string]$zipfilename)

  # 파일 명만 지정 했을 때 상대경로로 지정 해 줌.
  if(!$zipfilename.Contains("\"))
  {
    $zipfilename = ".\" + $zipfilename
  }


  if(-not (test-path($zipfilename)))
  {
    set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
    (dir $zipfilename).IsReadOnly = $false 
  }

  #상대경로를 절대경로로 변경
  $zipfilename = (Get-Item $zipfilename).FullName

 
  $shellApplication = new-object -com shell.application
  $zipPackage = $shellApplication.NameSpace($zipfilename)
 
  foreach($file in $input)
  {
            $zipPackage.CopyHere($file.FullName)
            Start-sleep -milliseconds 500
  }
}

profile 파일에 이 함수를 넣어두고 요렇게 사용하면 됩니다.




<참고 URL>
http://blogs.msdn.com/b/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx
Posted by 알 수 없는 사용자
:
2010. 8. 24. 15:03
안녕하세요. 엉스데브 입니다.

이번에 새로 WIndows 2008 R2 서버를 하나 설치 했습니다. 웹 사이트를 하나 운영 하려구요.
제가 요새 PowerShell 을 공부하는 중이라서 이번 웹서버 구축은 PowerShell 을 통해서 모든 것을 진행 해 보려고 합니다.

먼저 PowerShell 을 켜 볼까요?
Windows 2008 R2 서버는 관리자로 로그인시 작업표시줄에 PowerShell 아이콘이 기본적으로 있으며,
Windows 7 과는 다르게 아이콘을 오른쪽 클릭하고 "관리자 권한으로 실행" 메뉴를 클릭해서 실행 하지 않아도
자동으로 관리자 권한으로 실행 됩니다. 아무래도 서버 제품이다 보니 작업의 특성을 잘 살린 배려인것 같습니다. 편하네요~



Windows 2008 R2 는 기본적으로 "ServerManager" 라는 모듈을 제공합니다.
이 모듈은 역할, 역할 서비스 및 기능 등을 추가/삭제 할 수 있는 기능을 제공하며, 이를 통해 IIS 를 설치 할 수 있습니다.

어디 정말 "ServerManager" 모듈이 존재하는지 확인 해 볼까요?


네. 역시 존재하네요.

그럼 모듈을 한번 불러들여 보겠습니다. 모듈에서 어떤 cmdlet 을 제공하는지도 확인 해 볼까요?


이야.. 심플합니다. cmdlet 3개가 추가 된 커맨드의 전부네요.
게다가 모두 WindowsFeature 에 대한 내용들이고, Add / Get / Remove 등 직관적으로 무엇을 할 수 있는지가 파악 됩니다.
네.. WindowsFeature 들을 추가하고 목록을 가져오고 삭제도 할 수 있겠네요.

더 정확한 내용을 보려면 Get-Help 명령을 이용하면 됩니다. 도움말이 한글화 되어 있어 상당히 편하네요.


일단 어떤 WindowsFeature 들이 있는지 한번 살펴보겠습니다.


엄청 많이 표시 됩니다. 하부 항목들은 트리구조를 흉내내어 들여쓰기 되어 표시되는군요.
아마도 GUI 로 된 서버 관리자에서 관리 할 수 있는 모든 역할, 역할서비스 및 기능 들을 다 표시 해 주는 것 같습니다.
오른 쪽에는 해당 WindowsFeature 의 정식 이름이 표시 되네요.

너무 많으므로, 웹서버(IIS) 와 관련 된 항목만을 추려서 다시 봐야 겠습니다.
모든 웹서버(IIS) 관련 항목은 이름이 "Web-" 로 시작 합니다. 아래와 같이 입력하면 관련 내용만 표시 됩니다.


웹서버(IIS) 가 보입니다. 이 Feature 의 정확한 이름은 Web-Server 네요.

일단 무조건 설치 해 봤습니다. 약간의 시간이 지나 결과가 표시 되네요.


성공 여부, 재시작이 필요한지 여부, 종료 코드, 그리고 설치 된 항목의 리스트가 표시 되네요.
웹서버(IIS)에 포함된 모든 항목이 설치되는 것은 아니고, 꼭 필요한 필수 Feature 들만 골라서 설치 되네요.
(어떤게 설치 되었는지는 다시한번 Get-WindowsFeature -Name "Web-*" 명령어를 날려서 확인 해 보면 됩니다)

테스트로 설치 해 본 것인만큼 일단 지워 보겠습니다.


아, 지워지긴 했는데 재부팅을 해야지만 정상적으로 제거가 된다고 하는군요. 재시작 해 줍니다.


재부팅이 완료 되었습니다. 이제 실제 서비스에 사용할 웹서버를 다시 설치 해 볼겁니다.
전 서버 용량도 충분하고 혹시나 나중에 기능을 추가할 경우에 번거로운 일들이 생길까봐, 전체 기능을 다 설치 하기로 했습니다.
아래와 같이 입력하면 됩니다.


자, 그럼 잘 설치 되어 있는지 확인 해 볼까요??


모두 잘 설치가 되었습니다!(X 표시가 설치가 되었다는 표시입니다.)

PowerShell 로 IIS 설치하기 참 쉬운 것 같습니다. ^^


<참고 URL>
http://blogs.msdn.com/b/powershell/archive/2009/01/27/managing-server-features-with-powershell-cmdlets-on-windows-2008-server-r2-beta.aspx
Posted by 알 수 없는 사용자
:
2010. 8. 18. 17:58
안녕하세요. 엉스데브 입니다.

리눅스 시스템을 관리 할 때 편하게 사용했던 명령 중에 findgrep 명령이 있었습니다.
여러개의 폴더 및 하위 폴더의 파일을 대상으로 찾고자 하는 문자열을 포함한 파일을 찾아주는 기능을 하는 명령 입니다.
PowerShell 에서도 이 명령을 사용하고 싶어져서, 만들어 보았습니다.

function Search-FileByContentString
{
  param
  (
    [String]$SearchString,
    [String]$TargetDirectory,
    [String]$IncludeExtension = 'txt;asp;aspx;config;xml',
    [Int32]$SkipFileSize = 5MB
  )
 
 $directory = Get-ChildItem($TargetDirectory) -ErrorAction SilentlyContinue

  if($directory -eq $null)
  {
    return $null
  }

  foreach($item in $directory)
  {
    switch($item.GetType().ToString())
    {
      # 파일 일때
      'System.IO.FileInfo'
      {
        if (!($IncludeExtension.Split(';') -eq $item.Extension.Replace('.','')))
        {
          break
        }

        if($item.Length -gt $SkipFileSize)
        {
          break
        }
       
        $Lines = @(Get-Content($item.FullName))

        for($index = 0; $index -lt $Lines.Count; $index++)
        {
          if( $Lines[$index].Contains($SearchString))
          {
            Write-Host $item.FullName"("($index + 1)"): "$Lines[$index]
          }
        }

        break
      }

      # 디렉토리 일때
      'System.IO.DirectoryInfo'
      {
        Search-FilebyContentString -SearchString $SearchString -TargetDirectory $item.FullName -IncludeExtension $IncludeExtension -ExcludeExtension $ExcludeExtension -SkipFileSize $SkipFileSize
        break
      }

      # 다른 종류 일때
      default
      {
        Write-Host "Error:(" + $item.GetType().ToString() + ")"
        break
      }
    }
  }
}

실행 결과:



<참고 URL>
http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/05/09/powershell-dyi-commands-using-functions.aspx
Posted by 알 수 없는 사용자
:

BLOG main image
Windows Server를 공부 하는 사람들의 팀블로그 by 마성민

카테고리

분류 전체보기 (76)
Windows (2)
Powershell (56)
마성민 (3)
엉스데브 (20)
윈디안 (9)
10000wo (2)
cyber1008 (2)
Exterminate (3)
shc1313 (1)
junghwan83 (0)
@우주인 (16)
AD (0)
Exchange (6)
System Center (9)
IIS (0)
SQL (3)
Sharepoint (0)

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

Total :
Today : Yesterday :