Powershell
2011. 02. 11.
안혁
http://hyok.kr


동영상 파일을 관리하다 보면 이름을 일괄적으로 변경해야 할 경우가 있습니다. 예를 들면, 자막을 받았는데, 동영상은 MOVE01.AVI, MOVIE02.AVI 이런 형태인데, 자막은 SUBTITLE01.SMI SUBTITLE02.SMI 형태로 되어 있어 SMI 파일의 이름을 AVI와 똑같이 변경해야 하는 경우가 그렇지요.

[code]
PS C:\test> $i=1; Get-ChildItem *.smi | ForEach-Object { $name=$_.Directory.FullName + "\newname" + $i.ToString("00") + ".smi"; Move-Item -LiteralPath $_.Name $name; $i++; }
[/code]

Get-ChildItem: 현재 폴더에 있는 SMI 확장자의 파일을 모두 가져와서
ForEach-Object: 하나씩 처리합니다. {}안에 $_라고 적으면 이 안에 순서대로 대입됩니다.
$_.Directory.FullName: $_는 FileInfo 타입입니다. 이는 파일 경로를 의미합니다.
$name: 원하는 파일 이름을 정하고([경로]\newname01.smi, [경로]\newname02.smi, ......)
Move-Item: 이름 변경 -  이름을 바꿔서 같은 폴더에 옮겼다고 생각하면 됩니다.
$i.ToString("00")이라고 하면 $i에 들어 있는 1, 2, 3이라는 값이 01, 02, 03으로 바뀝니다. 두 자리로 표현되도록 방법이죠. 보통 동영상의 이름에 사용하는 순서는 두자리 숫자를 사용하죠? 그래야 탐색기에서 순서대로 정렬 되니까요.

위 코드는 변경할 이름을 $name에 직접 지정하는 방식입니다만, 좀 더 생각해보면 avi파일의 이름을 가져와서 $name에 담도록 하면 이 명령을 사용할 때마다 변경하지 않아도 되겠군요.

위에서 Rename-Item 대신 Move-Item을 사용한 이유는 원본 파일 이름에 '[' 또는 ']'문자가 있는 경우 파일을 찾을 수 없다는 오류가 발생하기 때문입니다. 보통 동영상 파일의 이름에는 대괄호가 많이 사용되잖아요? 그래서 다른 방법을 찾아본 것입니다. (제 의견입니다만, 이는 버그라고 생각합니다. Rename-Item만을 단독으로 사용할 때면 `[ 또는 `]과 같이 표기하여 사용하겠지만, 파이프(|)는 앞 명령의 결과가 객체로 넘어오므로 문제가 없어야 하지 않을까요? Move-Item이 정상적으로 작동하는 것처럼......)

단, 위 명령은 다음을 전제로 합니다.
1. Get-ChildItem은 파일 이름 순서대로 결과를 돌려줍니다.
2. 원본 smi 파일의 순서는 1부터 1씩 증가합니다.
3. 현재 폴더에는 변경하고자 하는 smi파일만 존재합니다.
Posted by 안혁 windfruit
Powershell
2010. 12. 27.
안혁
http://hyok.kr


Powershell에서 특정 문자열에 +1한 느낌으로 변경하는 것은 어떻게 할까요? 질문이 이해가 안되시죠? "abcdefg"라는 문장이 있는경우, 이를 "bcdefgh"라는 문장으로 바꾸고 싶은 경우를 말하는 겁니다. 이런건 C언어같은 프로그래밍 언어를 처음 배울 때, 문자가 사실은 아스키 값이라는 숫자라는 것을 이해하기 위한 실습 문제 정도되겠습니다. a라는 문자의 아스키 값이 97이라면 b의 아스키 값은 98이라는 거죠. 문제를 이해했다면 Powershell에서 하는 방법을 보겠습니다.

[code]
[char[]]"abcde" | ForEach-Object { [char]([int]$_ + 1) }
[/code]

"abcde"라고 적으면 Powershell에서는 String 타입이 되죠? 이를 char 타입의 배열 그러니까 { a, b, c, d, e } 형태의 값으로 변경했습니다. 그리고 파이프(|)를 사용해서 뒤로 던졌죠? ForEach-Object가 받아서 사용합니다. ForEach-Object는 배열을 첫번째부터 끝까지 순서대로 가져오는 명령어 인데요. [char]($_-1)이라는 명령을 배열 개수(여기는 문자가 5개이니까 5번)만큼 실행됩니다. $_는 각 배열의 값으로 변경되어서요. 결국 위 명령은 다음 명령이랑 같은거죠.

[code]
[char]([int][char]"a" + 1);
[char]([int][char]"b" + 1);
[char]([int][char]"c" + 1);
[char]([int][char]"d" + 1);
[char]([int][char]"e" + 1);
[/code]

좀 더 복잡해진 것 같지만, 같은 일을 5번 한다는 거랑 위 명령과 같은 일을 하는 것을 이해하시면 되겠습니다. 문자열을 문자(char)로 봐꾸고 아스키 값(int)으로 바꾼 후 1을 더하고 다시 문자(char)으로 변경하는 것입니다.

사용자 삽입 이미지

Posted by 안혁 windfruit

Exchange Server 2007, 2010
2010. 01. 15.
안혁
http://hyok.kr



Exchange 2007 이상에서는 Powershell을 이용하여 사서함 사용량을 쉽게 알 수 있습니다.

[code]
Get-MailboxStatistics | ft DisplayName, TotalItemSize
[/code]

DisplayName           TotalItemSize
-----------           -------------
홍길동                904B
왕서방                4770B
나사장                199927050B


일정 용량 이상 사용자를 알고 싶은 경우도 있을 겁니다.

[code]
Get-MailboxStatistics | Where-Object { $_.TotalItemSize -gt 1024000 } | ft DisplayName, TotalItemSize
[/code]

조금 더 생각해보면 현재 사서함의 평균 사용량도 알아볼 수 있겠지요? 용량을 모두 더하고 수 만큼 나누면 되니 어렵지 않겠습니다.

[code]
#평균 사용량 계산
$result = Get-MailboxStatistics |  Where-Object {$_.objectclass -eq "Mailbox"} #사서함 정보 목록
$total = $null #이전 작업 결과가 들어 있으면 의도치 않은 결과 출력됨
$result | ForEach-Object { $total += $_.TotalItemSize } #사서함 용량의 합
$average = $total / $result.Count #사서함 평균 사용량
 
#결과 처리
$average.Value.ToGB() #용량을 GB로 가져옴
$average.Value.ToKB() #용량을 KB로 가져옴
$average.Value.ToBytes() #용량을 Byte로 가져옴
[/code]

Get-MailboxStatistics을 실행하면 사용자 사서함 이외에 정보도 출력되므로 조건을 걸어 ObjectClass가 MailBox인 것만 가져옵니다. 각각의 TotalItemSize를 합하고 총 개수로 나눕니다. 여기서 나누는 수는 $result의 개수인데요. 이는 사용된 적이 없는 사서함을 포함하지는 않습니다. (유령회원은 회원일까요? 아닐까요?) 그런 것과 상관 없이 모든 사서함 수를 기준으로 하고 싶다면 Get-Mailbox을 활용하면 되겠습니다.

[code]
$average = $total / (Get-Mailbox).Count
[/code]

Posted by 안혁 windfruit

Powershell 2.0
Exchange Server 2007
IIS 7
2009. 11. 30.
안혁
http://hyok.kr



Powershell 2.0에 있는 Powershell ISE에서는 기본적인 명령어만 사용이 가능합니다. Powershell이 설치된 컴퓨터에 Exchange Server 2007이나 IIS 7이 설치되어 있다면 Powershell ISE에서도 이 명령을 사용할 수 있는 방법이 있습니다.

Windows Vista, Windows Server 2008에서는 IIS 7 관련 Powershell 명령을 사용하려면 추가로 Snap-In을 설치하여야 합니다.
http://www.iis.net/extensions/PowerShell

Powershell ISE를 실행 후 하단의 명령창에서 다음 명령을 실행합니다.

Exchange Server 2007
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin

IIS 7
Import-Module WebAdministration (또는 Add-PSSnapin WebAdministration)

혹시 명령 실행이 다음과 같이 원할하지 않을 수도 있습니다..

Import-Module : File C:\Windows\system32\WindowsPowerShell\v1.0\Modules\webadministration\WebAdministrationAliases.ps1 cannot be loaded bec
ause the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
At line:1 char:14
+ import-module <<<<  webadministration
    + CategoryInfo          : NotSpecified: (:) [Import-Module], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.ImportModuleCommand

이와 같거나 또는 정상적으로 진행되지 않는다고 판단되면 다음의 명령을 실행 후 다시 해보세요. 실행 권한이 없어서 발생하는 문제일 가능성이 있습니다.

Set-ExecutionPolicy -ExecutionPolicy UnRestricted

사용하는 추가 명령이 두가지인데, Import-Module 명령은 Powershell 1.0에는 없는 명령입니다. 2.0이 나온지 얼마되지 않아 방식이 혼재하고 있는 상태로 보여집니다.

Powershell 2.0 에서 부터 OS에 설치되어 있는 모든 파워쉘 모듈을 올리는 명령이 제공됩니다. 아래 명령이 기억하기는 쉬울 것 같습니다.

ImportSystemModules

일반 Powershell 명령 이름과는 달리 하이픈(-)이 없습니다.

Posted by 안혁 windfruit

Powershell 2.0
2008. 11. 04.
안혁
http://hyok.kr



Powershell 2.0이 드리어 출시 되었습니다. 정확히는 이미 출시되었었지만 Windows 7과 Windows Server 2008 R2에 내장된 형태로만 제공 되었던 Powershell 2.0이 이전 OS에서도 사용 가능하도록 출시 되었습니다.

http://go.microsoft.com/fwlink/?LinkID=151321

Windows Management Framework이라는 이름으로 공개가 되었는데, 이는 Powershell 2.0, WinRM 2.0, BITS 4.0을 가리킵니다. 이 중 앞의 2개만을 묶어 Windows Management Framework Core라는 설치 프로그램으로 제공됩니다.

사용자 삽입 이미지

설치 후 어디에 있는지 당황했습니다. 보조프로그램 아래에 있네요.

사용자 삽입 이미지

Powershell 2.0은 1.0에 비하여 많은 발전이 있었는데요. Management Framework라는 이름으로 묶을 만큼 많은 명령어를 제공하며, 원격으로 명령을 실행할 수도 있어 그 활용도가 더욱 높아졌습니다.

기본적으로 명령창을 제공하며 GUI 버전도 이번에 추가되어 좀 더 효과적인 작업이 가능하게 되었네요. Windows Powershell ISE를 실행하면 됩니다.

사용자 삽입 이미지


위 처럼 여러 줄의 스크립트를 실행해볼 수도 있고 디버깅도 가능합니다. (수준은 떨어지지만...) 결과는 중간의 실행창에 나오며 아래 창에서 명령을 직접 실행해볼 수도 있습니다. 실행창은 공유됩니다. 디버깅 중 변수값을 알아보려면 아래창에서 변수를 입력해봐야 합니다. ISE눈 아직 아쉬운 점이 많지만 Powershell의 발전처럼 더욱 나아질 것이라 기대해봅니다.
Posted by 안혁 windfruit

PowerShell
2008. 02. 28.
안혁
http://hyok.kr



PowerShell에서 다음 명령과 같이 확인 단계를 가지고 있는 명령이 있습니다.

[PS] C:\>Disable-TransportAgent -Identity 'attachment filtering agent'

Confirm
Are you sure you want to perform this action?
Disabling Transport Agent "attachment filtering agent". A service restart is required for the change to take effect.
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):n

배치 파일을 만들 때에는 이 확인이 방해가 되는데요. -Confirm옵션을 사용하면 확인하지 않고 명령을 실행할 수 있습니다.

[PS] C:\>Disable-TransportAgent -Identity 'attachment filtering agent' -Confirm:$false

여러 명령어를 실행한다면 다음과 같이 변수 설정으로 같은 효과를 얻을 수 있습니다.

[PS] C:\>$ConfirmPreference="None"
[PS] C:\>Disable-TransportAgent -Identity 'attachment filtering agent'
$ConfirmPreference 변수의 기본값은 High입니다. 설정할 수 있는 값은 None, Low, Medium, High 4개 입니다.

'ETC' 카테고리의 다른 글

2009년을 환영합니다.  (0) 2009.01.01
Devdays 2008 Online  (0) 2008.12.02
VIM 유용한 명령  (0) 2008.02.29
익스플로어 소스 보기에 VIM 연결  (0) 2008.02.28
PowerShell 명령 실행 중 확인 단계 생략  (0) 2008.02.28
Autorun 바이러스 치료  (0) 2007.10.31
Posted by 안혁 windfruit
이전버튼 1 이전버튼