Skip to content

Latest commit

 

History

History
84 lines (70 loc) · 4.86 KB

File metadata and controls

84 lines (70 loc) · 4.86 KB

VBScript → PowerShell

한국어 | 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.dllGetActiveObject 를 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 는 모두 승인된 동사이고, 파일명이 그렇게 생긴 이유다.