한국어 | English
Microsoft 는 2023년에 VBScript 를 지원 중단 대상으로 지정했다. Windows 11 24H2 에서 주문형 기능(FoD)이 되었고, 이후 단계에서 기본 비활성화 상태로 배포된 뒤 제거될 예정이다.
SAP GUI 의 스크립팅 엔진은 영향을 받지 않는다 — COM 인터페이스라 COM 을 다룰 수 있는
언어면 무엇이든 조작할 수 있다. 사라지는 것은 호스트인 cscript.exe 쪽이므로,
이 작업은 재설계가 아니라 언어 포팅이다.
| VBScript | PowerShell |
|---|---|
src/vbs/SapConnection.vbs |
src/ps/Connect-SapGui.ps1 |
src/vbs/SapTableInput.vbs |
src/ps/Set-SapTableColumn.ps1 |
src/vbs/ReservationExcelEdit.vbs |
src/ps/Edit-ReservationWorkbook.ps1 |
src/vbs/DateFormatCustom.vbs |
src/ps/ConvertTo-SapDate.ps1 |
src/vbs/BackupFolder.vbs |
src/ps/Backup-Folder.ps1 |
src/vbs/ExcelOpen.vbs |
아래 한 줄 |
src/vbs/Deduplication.vbs |
아래 한 줄 |
src/vbs/RegexCheck.vbs |
아래 한 줄 |
src/vbs/FileLog.vbs |
아래 한 줄 |
9개 중 4개는 의도적으로 포팅 파일을 만들지 않았다. 본문이 내장 명령 한 번 호출인 스크립트를 파일로 만들면 관리 대상만 늘고 얻는 게 없다.
# ExcelOpen.vbs
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.Workbooks.Open('C:\data\reservation.xlsx')
# Deduplication.vbs
('a,a,c,c,b' -split ',' | Select-Object -Unique) -join ','
# RegexCheck.vbs — StripPattern / MatchesPattern
'A-123-B' -replace '[^0-9]', ''
'A-123-B' -match '^\d+$'
# FileLog.vbs
Add-Content -Path C:\log\aae.log -Value 'started'
Get-Content -Path C:\log\aae.log -Raw # ReadAllText
Get-Content -Path C:\log\aae.log # ReadLines| VBScript | PowerShell | 비고 |
|---|---|---|
Option Explicit |
Set-StrictMode -Version Latest |
$ErrorActionPreference = 'Stop' 함께 |
CreateObject("X") |
New-Object -ComObject X |
|
GetObject(, "Excel.Application") |
[Runtime.InteropServices.Marshal]::GetActiveObject('Excel.Application') |
실행 중인 인스턴스에 붙는다 |
GetObject("SAPGUI") |
[Microsoft.VisualBasic.Interaction]::GetObject('SAPGUI') |
Add-Type -AssemblyName Microsoft.VisualBasic 필요. Marshal 에는 ROT 모니커 대응이 없다 |
WScript.Arguments.Item(0) |
param([Parameter(Mandatory)][string]$Name) |
이름 있고 검증되고 자체 문서화된다 |
WScript.Echo / .StdOut |
Write-Output |
Write-Host 는 사람이 볼 출력에만 |
WScript.StdErr.WriteLine |
Write-Error / throw |
|
WScript.Quit n |
exit n |
throw 로 던지고 호출자가 정하게 하는 편이 낫다 |
On Error Resume Next |
try { } catch { } |
파일 전체를 덮지 말 것 |
Scripting.Dictionary |
@{} 또는 [hashtable] |
|
Scripting.FileSystemObject |
Get-Content / Set-Content / Copy-Item |
|
Split(s, ",") |
s -split ',' |
기본이 정규식. 리터럴은 -split ',', 0, 'SimpleMatch' |
InStr(a, b) <> 0 |
$a.Contains($b) 또는 -like |
|
Replace(a, b, c) |
$a.Replace($b, $c) |
-replace 는 정규식이다 |
Right("0" & x, 2) |
'{0:00}' -f $x |
|
비밀번호를 argv 로 |
[PSCredential] 파라미터 |
README 의 보안 주의 참고 |
- PowerShell 7 의
GetActiveObject.[Runtime.InteropServices.Marshal]::GetActiveObject는 .NET Core 에서 제거됐다. PowerShell 7 에서는 Windows PowerShell 호환 계층 (Import-Module -UseWindowsPowerShell)을 쓰거나oleaut32.dll의GetActiveObject를 P/Invoke 해야 한다. 여기 COM 스크립트들은 Windows PowerShell 5.1 이 가장 무난하다. - COM 객체를 해제할 것.
finally에서[Runtime.InteropServices.Marshal]::ReleaseComObject를 호출하지 않으면 Excel 이 보이지 않는 프로세스로 남아 파일을 붙잡고 있다. - 인코딩. Windows PowerShell 5.1 은 BOM 없는 파일을 ANSI 로 읽는다. 한글이 든
.ps1은 UTF-8 BOM 포함으로 저장해야 한다. PowerShell 7 은 UTF-8 이 기본이라 필요 없지만, BOM 이 있어도 무해하다. - Excel enum 상수(
xlValues = -4163,xlWhole = 1)는 late binding 시 정의되어 있지 않다. 여기 스크립트들처럼 직접 선언해야 한다. - 승인된 동사(approved verb).
Get-Verb로 목록을 볼 수 있다.Connect,Set,Edit,Backup,ConvertTo는 모두 승인된 동사이고, 파일명이 그렇게 생긴 이유다.