WinCNT

CMD와 ADB로 만들었던 스크립트를 PowerShell로 바꿔보자! 본문

Unity/Unity 관련

CMD와 ADB로 만들었던 스크립트를 PowerShell로 바꿔보자!

WinCNT_SSS 2023. 10. 10. 09:54

서론

CMD(Command Prompt)의 bat파일을 완성해서 달성감에 젖어있을 때, 회사의 빌드 머신은 PowerShell 위주로 돌아간다는 것을 알게 되었다

조금 살펴보니 bat파일의 내용을 못 쓸 것은 아니었지만, 다른 Github Actions 설정들은 전부 PowerShell로 되어 있었기에 이에 맞추기로 하였다

즉, 이번 글은 CMD의 bat파일을 PowerShell로 바꾸면서 발생한 삽집들을 정리한 글이다


하지만 사실 명령어 대부분은 호환됩니다

소제목 그대로 CMD의 명령어는 대부분 호완이 되기 때문에 그대로 사용해도 상관 없다고 한다

역시 Microsoft야!

 

예를 들어 PowerShell 스크립트에서 Write-Output 대신에 CMD의 echo를 써도 정작 작동하고, Set-Location 대신에 CMD의 cd를 써도 같은 동작을 한다

(친절하게 경고로 알려주는 Editor나 확장 기능도 있다)

 

그래도 이번 글에서는 최대한 PowerShell에서 사용하는 커맨드 위주로 정리하고자 한다

(필자가 PowerShell은 처음이라 틀릴 수도 있지만 너그러이 봐주셨으면 한다…)


일단은 권한 설정부터

PowerShell의 스크립트인 .ps1을 사용하기 위해서는 우선 권한 설정부터 변경해야 한다

이쪽은 좋은 글들이 많으니 생략하도록 하겠다

[Power Shell] 파워쉘 스크립트(.ps1) 실행하는 방법

 

[Power Shell] 파워쉘 스크립트(.ps1) 실행하는 방법

파워쉘 스크립트를 실행하는 방법에 대해 말씀드리겠습니다. 윈도우는 기본적으로 파워쉘 스크립트를 실행하지 못하게 막아놓았습니다. 때문에 스크립트를 실행하려면 기본 PowerShell 실행 정책

betterinvesting.tistory.com

[PowerShell] 파워쉘 ps1 파일 실행 권한 변경

 

[PowerShell] 파워쉘 ps1 파일 실행 권한 변경

파워쉘을 사용하다 보면은, 아래와 같은 오류를 보시는 경우가 발생합니다. PowerShell의 경우 기본적으로 ps1 확장자 파일을 실행하지 못하도록 되어 있습니다. 이는, 해당 정책이 Restricted 로 되어

holjjack.tistory.com


변수 선언과 echo

변수 선언은 다음과 같이 바뀌었다

좀 더 일반적인 프로그래밍 언어와 가까워진 느낌이다

@REM cmd의 경우
set "ADB_DIR=C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\SDK\\platform-tools\\"

# PowerShell의 경우
$ADB_DIR = "C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\SDK\\platform-tools\\"

 

echo는 Write-Host로 대체할 수 있는데, 길어서 그냥 echo로 하는 경우가 많은 것 같다

@REM cmd의 경우
echo Hello, world!

# PowerShell의 경우
Write-Host Hello, world!

작업 폴더 이동하기!

작업 폴더를 이동하는 cd 커맨드에 해당하는 커맨드는 Set-Location -Path이다

다음은 사용 예시이다

@REM cmd의 경우
set "ADB_DIR=C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\SDK\\platform-tools\\"
cd %ADB_DIR%

# PowerShell의 경우
$ADB_DIR = "C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\SDK\\platform-tools\\"
Set-Location -Path $ADB_DIR

PowerShell로 접속된 VR(Android)기기 체크!

CMD에서는 약간 복잡하게 구현했었는데, PowerShell에서는 좀 더 간단하게 구현이 가능했다

setlocal enabledelayedexpansion도 필요 없고, 정규 표현을 사용할 수 있다는 것도 좋았다

$ADB_DIR = "C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\SDK\\platform-tools\\"
$APK_PATH = "C:\\Users\\...빌드한 apk 파일의 경로...\\Application.apk"
$OUTPUT_PATH = "C:\\Users\\user\\Desktop\\"

Write-Host "-Start!"

# adb.exe이 있는 폴더로 이동
Set-Location -Path $ADB_DIR

Write-Host "-Check Android Device Connected"
$adbDevicesOutput = .\\adb devices
# List로 시작하지 않으면서 device로 끝나는 행의 개수
$numConnectedDevices = ($adbDevicesOutput | Select-String -Pattern "^(?!List).*device$").Count

if ($numConnectedDevices -eq 0) {
    Write-Host "-No Android Devices Connected"
    Exit 1
} else {
    Write-Host "-Android Devices Connected!"
}

PowerShell로 프로세스 실행하기

유니티 에디터(Unity.exe)를 이용해서 빌드하는 부분은 살짝 복잡해졌다

Start-Process -FilePath를 통해 실행할 프로세스의 경로를 설정해야 하고, 인수(Argument)는 -ArgumentList를 통해서 설정해야 한다

echo "-Start APK Build!"

@REM cmd의 경우
"C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Unity.exe" -batchmode -quit -logfile "로그 파일 패스(디렉토리 + 파일명)" -projectPath "실행할 프로젝트의 디렉토리" -executeMethod ExCI.ExBuild

# PowerShell의 경우
Start-Process -FilePath "C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Unity.exe" -ArgumentList "-batchmode -quit -logfile <로그 파일 패스(디렉토리 + 파일명)> -projectPath <실행할 프로젝트의 디렉토리> -executeMethod ExCI.ExBuild"

특정 프로세스가 종료될 때까지 기다리기

예를 들어 위에서 실행한 유니티 에디터의 빌드 작업이 끝날 때까지 대기하고 싶은 경우, 다음과 같이 구현하면 된다

$process = Get-Process -Name Unity
Wait-Process -InputObject $process

ADB 실행 부분은 크게 다를 게 없었다

ADB로 APK 파일을 Install하거나 실행하는 부분은 크게 다를 게 없었다

다만 cmd에서는 adb.exe가 있는 폴더라면 adb의 커맨드를 바로 사용할 수 있었지만, PowerShell에서는 앞에 .\와 같이 경로를 명시해줘야 한다는 차이점이 있었다

@echo off

@REM cmd의 경우
adb install -g "C:\\Users\\<빌드한 apk 파일의 경로>\\Application.apk"

# PowerShell의 경우
.\\adb install -g "C:\\Users\\<빌드한 apk 파일의 경로>\\Application.apk"

참고로 adb의 경로를 미리 설정해두고 "&”를 이용해서 실행하는 것이 가능하다

다음은 그 예시이다

$ADB_PATH = "C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\SDK\\platform-tools\\adb"

& $ADB_PATH shell am broadcast -a com.oculus.vrpowermanager.prox_close
& $ADB_PATH install -g "C:\\Users\\<빌드한 apk 파일의 경로>\\Application.apk"
& $ADB_PATH shell am broadcast -a com.oculus.vrpowermanager.automation_disable

App이 종료될 때까지 대기하는 방법

마지막으로는 App이 실행 중인지 체크하고, 실행 중이면 몇 초 후 다시 체크하는 방법이다

이 부분도 접속된 기기 체크와 마찬가지로 PowerShell에서 좀 더 스마트하게 구현할 수 있었다

ADB로 특정 프로세스가 실행 중인지 확인하는 것은 같지만, while문이나 Start-Sleep를 통해 코드 자체가 읽기 쉽게 바뀌었다

$ADB_PATH = "C:\\Program Files\\Unity\\Hub\\Editor\\<version>\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\SDK\\platform-tools\\adb"

while ($null -ne (& $ADB_PATH shell ps | Select-String -Pattern "com.example.AppName")) {
    Write-Host "-Application is Running!"
    Start-Sleep -Seconds 10
}
Write-Host "-Application is not Running!"

마무리

시행착오는 많았지만 CMD로 작성한 스크립트를 무사히 PowerShell의 스크립트로 바꿀 수 있었다

처음에는 CMD가 더 편한 것 같았지만, 익숙해지면 역시 PowerShell이 더 좋은 것 같기도 하고…

문제는 익숙해지려면 아직도 멀었다는 점이다😂


참고 사이트

[Power Shell] 파워쉘 스크립트(.ps1) 실행하는 방법

 

[Power Shell] 파워쉘 스크립트(.ps1) 실행하는 방법

파워쉘 스크립트를 실행하는 방법에 대해 말씀드리겠습니다. 윈도우는 기본적으로 파워쉘 스크립트를 실행하지 못하게 막아놓았습니다. 때문에 스크립트를 실행하려면 기본 PowerShell 실행 정책

betterinvesting.tistory.com

[PowerShell] 파워쉘 ps1 파일 실행 권한 변경

 

[PowerShell] 파워쉘 ps1 파일 실행 권한 변경

파워쉘을 사용하다 보면은, 아래와 같은 오류를 보시는 경우가 발생합니다. PowerShell의 경우 기본적으로 ps1 확장자 파일을 실행하지 못하도록 되어 있습니다. 이는, 해당 정책이 Restricted 로 되어

holjjack.tistory.com

Powershellの「&」の意味とは - 初心者向けエンジニアブログ

 

Powershellの「&」の意味とは - プログラミング入門 学習サイト

powershellの"&"の意味とは!? まずこのアンドマークには別名が存在しており 名前を「アンパサンド」という powershellにおけるアンパサンドは「実行演算子」と呼ばれる役割が与えられており 文

minegishirei.hatenablog.com

そのマシンユーザー不要ですよ!GitHub Appsを使ってGitHub Actionsを利用しよう

 

そのマシンユーザー不要ですよ!GitHub Appsを使ってGitHub Actionsを利用しよう

バッジを贈って著者を応援しよう バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。 バッジを贈る

zenn.dev

自動トークン認証 - GitHub Docs

 

自動トークン認証 - GitHub Docs

GitHub では、GitHub Actions の代理で認証を受けるために使用できるトークンが提供されます。

docs.github.com