요즘 PowerShell 7.4.5
버전이 신기해서 이것저것 시도해보고 있다.
시도해보면서 "이건 나중에도 쓸만 하겠다" 싶은 것들을 모아 봤다.
참고로 Window 에 기본적으로 깔려있는
Windows Powershell
과 다른 것이다!
PowerShell 6 버전 이후로는 기본적으로Cross-Platform
지원이 된다!
그래서 기본 명칭이 앞에 "Windows" 라는 문구를 뺀 것이다.
이런 이유로 Window 사용자여도 따로 설치해야 되며,
설치법은 여기에서 확인해보길 바란다.
추후에도 계속해서 쓸만한 것들을 찾으면 하단에 추가될 예정이다.
최근 수정일:2024-10-15
변경 사항:정규 표현식을 이용한 재귀적 파일명 탐색
내용 추가
Powershell
에서는 new line
을 ` (backtick, 백틱) 으로 표현한다.Powershell
의 모든 명령어는 {동사}-{명사}
형태이다.Get-ChildItem
Powershell
을 tab
을 통한 명령어 및 옵션 자동완성이 지원이 된다.cmdlet
)는 alias
가 존재한다.Get-Alias -Definition {명령어}
를 통해서 알 수 있다.''
로 감싸주자.Copy-Item -Path 'C:\Users\devToroko\My Documents\' -Destination ...
@(1,2,3,4)
@{"id"="devToroko";"job"="programmer"}
@(@{1 = 1}, @{2 = 2})
Map 표현 방법
은 반드시 숙지하시기 바랍니다. 상당히 자주 쓰입니다!
주의사항: 여기서 볼 명령어들은
bash
와 유사한 것들이 종종 보일 것이다.
하지만 이 모든 명령어들은 실제 PowerShell 에서 사용되는 명령어들의Alias
이다!PS C:\Users\devToroko> Get-Alias -Name mv, ls, cat, cp | Format-Table -AutoSize CommandType Name Version Source ----------- ---- ------- ------ Alias mv -> Move-Item Alias ls -> Get-ChildItem Alias cat -> Get-Content Alias cp -> Copy-Item
즉 아래 작성된
alias
들은bash
와 비슷한 동작을 하지만 같지는 않다라는 것을 명심하자.
cd
echo
ls
, dir
cat
notepad {파일명}
code {파일명}
처럼 해도 된다.ctrl + w
를 눌러서 메모장을 닫으면 된다.clear
cp
mv
pwd
ni -Type File {파일 명}
, tee {파일명}
ni -Type Directory {디렉토리 명}
rm
Get-Help {cmdlet name}
-online
옵션을 덧붙여주자.명령어의 일부만 기억나는 경우가 상당히 많다.
그때 마다 인터넷을 뒤지는 건 좀 시간이 아까우니 아래처럼 검색하자.
아래 예시는 nettcp
까지만 명령어를 기억날 때
어떻게 검색하는 지를 보여준다. 참고로 대소문자 상관없이 검색된다 👍
get-command | where { $_.Name -match 'nettcp' }
### 출력:
#CommandType Name Version #Source
#----------- ---- ------- ------
#Function Get-NetTCPConnection 1.0.0.0 NetTCPIP
#Function Get-NetTCPSetting 1.0.0.0 NetTCPIP
#Function Set-NetTCPSetting 1.0.0.0 NetTCPIP
(Get-Command ogr2ogr.exe).Path
Powershell 에서는 어떤 결과가 나오면 Object 이 나올 때도 있다.
이때 나온 Object 에 어떤 Properties 가 있는지 알아야 사용할 수 있다.
Properties 사용법은 아래와 같다.
(iwr -Uri https://jsonplaceholder.typicode.com/posts/1) |
Get-Member
TypeName: Microsoft.PowerShell.Commands.BasicHtmlWebResponseObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Content Property string Content {get;}
...생략...
# 특정 패턴의 프로퍼티를 찾으려면?
(iwr -Uri https://jsonplaceholder.typicode.com/posts/1) |
Get-Member -Name con*
TypeName: Microsoft.PowerShell.Commands.BasicHtmlWebResponseObject
Name MemberType Definition
---- ---------- ----------
Content Property string Content {get;}
# 이렇게 확인한 Property 는 아래처럼 사용 가능
#
# 방법 1:
# (iwr -Uri "https://jsonplaceholder.typicode.com/posts/1").content
#
# 방법 2:
# iwr -Uri "https://jsonplaceholder.typicode.com/posts/1" |
# Select-Object -ExpandProperty Content
[Convert]::To # ...까지만 쓰고 ctrl + space 로 자동완성 기능 사용
이렇게 입력하면 아래처럼 나온다.
[System.Convert]::ToBase64String((get-content -Path .\test.png -AsByteStream -Raw)) >> capture.txt
# WARNING: Encoding not used when '-AsByteStream' specified.
# ... 라는 경고문은 "진짜로" 무시해도 된다. 아~무 문제없다.
참고: https://jaredwinick.github.io/base64-image-viewer/ 에서 테스트 가능
PS C:\Users\devToroko> New-Item -ItemType Directory jquery_copy
PS C:\Users\devToroko> cd jquery_copy
PS C:\Users\devToroko\jquery_copy> New-Item -ItemType File 1.txt
PS C:\Users\devToroko\jquery_copy> notepad 1.txt
# 메모장으로 파일 내용 수정 후, ctrl + w 를 눌러서 메모장 닫음
# 그 후에 메모장 내용을 아래 처럼 읽으면, 편집된 내용을 확인할 수 있다.
PS C:\Users\devToroko\jquery_copy> get-content 1.txt
## 예시 1 : 파일 명칭 한번에 `random_point_5179` 로 바꾸기
Get-ChildItem |
Rename-Item -NewName {
'random_point_5179' + $_.Extension
}
## 예시 2 : 기존 명칭, 확장자는 유지하고, 앞에 "prefix-" 를 붙임
Get-ChildItem | foreach -ErrorAction Stop {
Rename-Item -Path $_ -NewName "prefix-$($_.BaseName).$($_.Extension)"
}
참고: 더 응용해보고 싶다면 이 링크를 참조하시길 바랍니다.
copy-item -Path .\jquery_copy\ -Destination .\jquery_copy2\ -Recurse -Container
-Force
옵션도 주자.파일 복사시 파일을 복사할 곳에 폴더가 없으면 에러가 난다.
디렉토리 구조가 잡히지 않은 상태에서는 파일 복사를 원하면 아래 스크립트를 활용하자.
$source="S:/somewhere/favicon.ico"; $destination="C:/somewhere/favicon.ico"; `
Copy-Item $source -Force -Destination `
(New-Item -Path (Split-Path -Path $destination) -Type Directory -Force)
위의 명령어가 좀 장황하게 느껴질 수 있다.
만약 window 사용자면 CMD 로 위 명령으를 아래처럼 대처할 수 있다.echo F | xcopy "S:\somewhere\favicon.ico" "C:\somewhere\favicon.ico" /E /H /K
주의! 디렉토리 경로 구분자는 "\" 를 사용해야 한다.
rm -Recurse -Force .\삭제할_폴더_명
# 현재 폴더(.) 에 있는 모든 item 들의 절대 경로를 뽑아낸다.
(Get-ChildItem . -Recurse).FullName
# alias 를 사용하면?
(dir . -Recurse).FullName
# 만약에 이 내용들을 Clipboard 에 바로 넣어서 사용하고 싶다면?
(dir . -Recurse).FullName | set-clipboard # 이러고 나서 ctrl+v 하면 된다.
# 만약에 File 의 절대 경로만 보고 싶다면?
(dir . -File -Recurse).FullName
# 이외에도 -Filter 라는 옵션을 통해서 특정 파일 확장자만 조회할 수도 있다.
(dir . -File -Recurse -Filter *.jar).FullName # jar 파일만 조회
ps: 만약 현재 경로에 대한 조회면, 경로 표시로 사용한 "." 표기는 생략해도 됩니다.
# 현재 디렉토리 경로(".")를 베이스로 재귀 검색을 시작합니다.
get-childitem -Path "." -Recurse | select -ExpandProperty FullName | Where-Object {
$_.Substring($_.LastIndexOf('\') + 1) -match '^(?i)(?!README\.txt$).+\.(csv|txt)$'
}
위의 재귀식(^(?i)(?!README\.txt$).+\.(csv|txt)$
) 은 제가 필요해서 작성한 것이고,
여러분들 입맛에 맞게 바꾸시길 바랍니다!
흔치 않지만 경로 표기를 "\" 에서 "/" 로 바꿔야 하는 경우가 있습니다.
그때는 아래처럼 해보시기 바랍니다.
# 1. 기본적인 사용법은 아래와 같습니다.
(Get-ChildItem -Recurse -Force).FullName -replace("\\", "/")
# 출력 예시:
# C:/study/spring-boot-inflearn/tool/apache-tomcat-10.1.13
# C:/study/spring-boot-inflearn/tool/apache-tomcat-10.1.13.zip
# C:/study/spring-boot-inflearn/tool/command.txt
# 2. -replace 는 여러번 호출도 가능합니다.
(Get-ChildItem -Recurse -Force).FullName -replace("\\", "/") -replace("C:/", "/")
# 출력 예시:
# /study/spring-boot-inflearn/tool/apache-tomcat-10.1.13
# /study/spring-boot-inflearn/tool/apache-tomcat-10.1.13.zip
# /study/spring-boot-inflearn/tool/command.txt
# 방법 1: 서브 디렉토리가 없는 구조인 경우
(Select-String -Path .\*.txt -Pattern 'Group ID' -List).Path
# 방법 2: 서브 디렉토리도 있는 구조인 경우
Get-ChildItem -Recurse |
Select-String -Pattern "Group ID" -CaseSensitive -List |
Select-Object Path
@'
행정경계_시도(행정동)
행정경계_읍면동(행정동)
행정경계_시군구(행정동)
행정경계_읍면동(법정동)
행정경계_시군구(법정동)
행정경계_리(법정동)
행정경계_시도(법정동)
'@ -split '\r?\n' | ForEach-Object {
echo $_
}
new Line 이 포함된 문자열을 복사해서
@'~'@
사이에 붙여넣고 싶다면
약간의 노하우가 필요합니다. 먼저 아래처럼 작성합니다.@' '@
이 상태에서 두번째 줄에 있는
'@
바로 앞에 커서를 맞추고,
붙여넣기를 해야합니다. 그리고 붙여넣은 문자열의 마지막에'@
붙어있으면,
'@
앞에서 Enter 를 쳐서 줄바꿈을 해줍니다.
# 현재 경로에 있는 zip 파일을 해당 위치에서 그대로 압축해제 한다.
# 참고로 압축해제 결과물 이름도 주고 싶다면... "-DestinationPath ./<명칭작성>"
Expand-Archive .\apache-tomcat-10.1.13.zip -DestinationPath ./
# ls 로 확인
cd apache-tomcat-10.1.13
ls
이외에도 더 자세한 압축하기/압축해제 방법은 powershell(v7.3) 공식문서를 참조하자.
invoke-item(= ii)
를 호출하면 됩니다.
ii .
# 자주사용되는 Path 환경변수에 원하는 경로 추가.
# 지금은 동적으로 jdk 경로를 추가했다.
$env:Path += ";C:\Users\dailycode\.jdks\azul-17.0.7"
# 맨앞에 추가하고 싶다면?
# $env:path = C:\Users\dailycode\.jdks\azul-17.0.7;" + $env:path
# 정말 등록되었는지 확인
($env:path).Split(";") | Select-String "jdk"
참고로 이 방법으로 환경변수로 세팅해도, 전역적으로 적용되는 게 아니라,
현재 콘솔화면을 열은 세션에 한해서만 적용되는 것이다.
환경변수 Path
에 동적으로 생성된 경로
를 사용하는 경우가 있습니다.
(위의 예시 그림에서는 %JAVA_HOME%\bin
경로가 그렇습니다)
만약에 pwsh
에서 env:JAVA_HOME="~~~~"
을 실행해서 값을 바꾸면
위의 Path
가 동적으로 변경되서 pwsh
에 적용되길 바라겠지만,
실제로는 그렇게 동작하지 않습니다. pwsh
을 실행했을 때 처음 가져온 Path 를 계속
유지시킵니다. 그렇기 때문에 이를 한번 새로고침(?)해줘야 되는데 방법은 아래와 같습니다.
$env:JAVA_HOME="다른 jdk home directory 경로 입력";
# 시스템 환경 변수 값 읽어서 적용하기
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
# 사용자 환경 변수 값 읽어서 적용하기
# $env:Path = [System.Environment]::GetEnvironmentVariable("Path","User")
아무래도 이건 alias 로 지정하고 사용하는 게 편할 듯하네요.
# 현재 콘솔 인코딩 방식 조회
[Console]::OutputEncoding
# 변경법 1
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
# 변경법 2
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(949)
가끔 pwsh 콘솔에서 인코딩이 깨지는 경우가 있는데,
위처럼 인코딩을 변경해서 인코딩 깨짐을 해결할 수 있다.
참고: GetEncoding(949) 에서 949 는 뭘 의미하는가?
949 라는 숫자는 Window 에서 인코딩을 구분하는 아이디 값인 code page 이다.
이 code page 와 매칭되는 인코딩을 보고 싶다면 아래처럼 입력하고 검색할 수 있다.([System.Text.Encoding]::GetEncodings()) | Where-Object {$_.CodePage -eq '949'} # 아래처럼 출력됨. CodePage Name DisplayName -------- ---- ----------- 949 ks_c_5601-1987 ks_c_5601-1987
ctrl + r
을 입력하고 자신이 사용했던 명령어의 일부를 치면 된다.
그러면 자동완성이 되는데, 여기서 그냥 취소하고 나가고 싶으면 ctrl + c
,
명령어를 바로 실행시키려면 enter
, 명령어를 약간 편집 하고 사용하고 싶다면
방향키
를 입력하면 된다.
이외에도 아래처럼 history 와 invoke-history 명령어를 섞어서 사용도 가능하다.
history
로 먼저 이력을 보고invoke-history {history 에서 보이는 번호}
를 입력하면 명령어 재실행이 가능하다.get-history | Select-Object -Last 1
# 만약에 마지막 명령어를 클립보드에 복사하고 싶다면 아래처럼.
get-history | Select-Object -Last 1 | Set-Clipboard
# 방법 1 : python 으로 Path 에 노출된 모든 경로를 읽어옵니다.
# 반드시 where.exe 라고 입력해야 합니다. where 라고 입력하면 안되요!
where.exe python
# 출력 결과:
# C:\Users\devToroko\Documents\langchain\.venv\Scripts\python.exe
# C:\Users\devToroko\.pyenv\pyenv-win\shims\python
# C:\Users\devToroko\.pyenv\pyenv-win\shims\python.bat
# C:\Users\devToroko\AppData\Local\Microsoft\WindowsApps\python.exe
# 방법 2: python 으로 Path 에 노출된 것들 중 1순위만 조회합니다.
Get-Command python | select -ExpandProperty Source
# 출력 결과:
# C:\Users\devToroko\Documents\langchain\.venv\Scripts\python.exe
## 명령어 이름으로 alias 목록 조회
PS C:\Users\devToroko> Get-Alias -Definition Get-ChildItem
CommandType Name Version Source
----------- ---- ------- ------
Alias dir -> Get-ChildItem
Alias gci -> Get-ChildItem
Alias ls -> Get-ChildItem
## alias 로 실제 사용 명령어 알아내기
PS C:\Users\devToroko> Get-Alias -Name ls
CommandType Name Version Source
----------- ---- ------- ------
Alias ls -> Get-ChildItem
흔하지 않지만 가끔 완성된 문자열에 대한 연산을 하고 싶을 수 있다.
그럴 때는 이렇게 하면 된다.
Invoke-Expression 0+1+2+3+4+5+6+7+8+9;
# ===> 45
$array1 = 0,1,2,3,4,5,6,7,8,9;
Invoke-Expression ($array1 | Join-String -Separator '+');
# ===> 45
Start-Process https://www.naver.com/
# 또는 alias 를 사용해서 아래처럼도 가능
start https://www.naver.com/
Start-Process -NoNewWindow .\h2.bat
아 최근에 알았는데, 이걸 실행한 콘솔창을 끄면, 실행했던 프로세스가 꺼지네요...
이건 방법을 더 알아보겠습니다!
cmd 에서 ping 명령어와 아주 유사한 기능이다. 사용법은 아래와 같다.
# ip test ==> table 로 출력한다.
Test-Connection 8.8.8.8 -Repeat
# ip + port test ==> True / False 를 반환한다.
Test-Connection 8.8.8.8 -TcpPort 443
-Repeat
인자를 주면 계속해서 테스트 요청을 전송한다. 멈추고 싶으면 ctrl + c
참고:
이상하게
-TcpPort
를 사용하면-Repeat
를 인식을 못하는 문제가 생겼습니다.
원인은 정확히 모르겠네요. 일단 어떻게든 동작시키기 위해서 아래처럼
while 문을 돌려서 Repeat 를 대체할 순 있습니다.while(test-connection 10.0.8.6 -TcpPort 7922) { Write-Host "connect date: $(Get-Date -format "yyyy.MM.dd HH:mm:ss")" Start-Sleep 3; # 3초마다 다시 test-connection 호출! } ## 아래처럼 출력될 겁니다. ## connect date: 2023.09.04 18:08:01 ## connect date: 2023.09.04 18:08:04
host ip 를 통해서 host 명을 알아내든지
반대로 host 명으로 ip 를 알아내는 방법은 아래와 같다.
# 네이버의 IP 얻어내기
[System.Net.Dns]::GetHostAddresses('naver.com') | select IPAddressToString
# IP 로 호스트 명칭 구하기
[System.Net.Dns]::GetHostEntry('8.8.8.8')
IP 를 알아내는 방법은 2가지가 더 있다.
방법1
Test-NetConnection -ComputerName "www.google.com" -InformationLevel "Detailed"
방법2
Resolve-DnsName google.com
Stop-Process -Id (Get-NetTCPConnection -LocalPort "8080").OwningProcess
참고로 현재 사용되는 포트가 아니면 에러를 뱉어냅니다.
bash 를 사용한 사람이라면 curl 을 알 것이다.
이와 상당히 비슷한 기능으로 Invoke-WebRequest
라는 명령어가 있다.
alias 로는 iwr
를 사용하며 이 기능을 사용한 웹 요청을 해보겠다.
그리고 추가적으로 이 기능을 통해서 파일을 다운로드 받는 법도 알아보자.
참고:
최근에 알았는데curl
은Window 10 (build 17063), 11
에 기본
내장되어 있다고 하네요. 참고: https://curl.se/windows/microsoft.html
### 일반적인 GET Method HTTP 요청
(iwr -Uri "https://jsonplaceholder.typicode.com/posts/1").content
### 출력결과:
# {
# "userId": 1,
# "id": 1,
# "title": "sunt aut facere repellat provident occaecati excepturi optio ..생략..",
# "body": "quia et suscipit\nsuscipit recusandae consequuntur expe ..생략.."
# }
# Jquery 를 다운로드 받아보자.
(iwr -Uri "https://code.jquery.com/jquery-3.6.1.js").content `
| Out-File -Encoding utf8 -Path "./jquery-3-6.1.js"
### 출력결과:
PS C:\Users\devToroko> ls # jquery 파일이 생성된 것을 확인한다.
Directory: C:\Users\devToroko\jquery_copy
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2022-12-11 오후 1:32 10 1.txt
-a--- 2022-12-11 오후 2:06 289814 jquery-3-6.1.js
### 만약에 복잡한 Http Method Post 를 보내려면?
Invoke-WebRequest `
-Headers @{"Authorization" = "Bearer N-..생략..";"accept"="application/json"} `
-Method POST `
-Body (@{"lastName"="doe";}|ConvertTo-Json) `
-Uri https://api.dummy.com/getUsers `
-ContentType application/json
# 또 다른 전송 예시
iwr -Uri http://localhost:8080/run -Method Post -ContentType "application/json" -Body @'
{"name": "restJob", "jobParameters": {"foo": "bar", "baz": "quix"}}
'@
위에서는 invoke-webrequest
를 썼다면, 이번에는 Invoke-RestMethod
사용법~
PS C:\Users\devToroko> `
Invoke-RestMethod -Uri 'https://epsg.io/?format=json&q=5179' `
| ConvertTo-Json -Depth 10 `
| Out-File -Encoding utf8 -FilePath 'C:\study\geodata\5179.txt'
json 문자열을 받아서 파일에 저장한 예이다.
파일을 열어보면 아래와 같이 나온다. 인코딩되 제대로 UTF-8 로 잘 박힌다.
위의 2개의 목차에서 Invoke-WebRequest
와 Invoke-RestMethod
를 봤는데,
둘 간의 차이가 뭔지 궁금해서 검색해봤다.
그리고 https://www.truesec.com/hub/blog/invoke-webrequest-or-invoke-restmethod 링크가
내용이 좋아서 해당글을 참조했다.
Invoke-WebRequest
The Invoke-WebRequest cmdlet sends HTTP, HTTPS, FTP, and FILE requests to a web page or web service. It parses the response and returns collections of forms, links, images, and other significant HTML elements.
Invoke-RestMethod
The Invoke-RestMethod cmdlet sends HTTP and HTTPS requests to Representational State Transfer (REST) web services that returns richly structured data.
일단 둘의 정의는 위와 같고, 좀 더 상세한 차이로는...
Invoke-WebRequest
는 네트워크에서 요청할 수 있는 다양한 프로토콜을 전반적으로
지원하고, 받는 Response 에서 Header 정보 같은 메타 정보를 제공 받을 수 있다.
반면 Invoke-RestMethod
는 Invoke-WebRequest
을 한번 Wrapping 한
명령어로 HTTP(S) 요청만 지원하며, 반환값으로 메타정보를 모두 들고 오지 않고,
오로지 content 와 관련된 내용만 가져온다. 이때 반환받는 결과는 Http Response
의content-type
에 따라 적절하게 객체를 생성해서 결과로 반영한다.
하지만 메타 정보를 들고 오지 않다보니, Http Status 코드가 200, 201 일 때만
정상적으로 반환받고, 이외 상태 코드를 받으면 에러를 뱉어낸다.
결론:
단순히 HTTP(S) 요청의 content 의 내용을 받아서 사용하려면 Invoke-RestMethod
,
그외의 다양한 프로토콜과 메타정보가 필요하면서 Http Status
에 따라 분기 처리가
필요하다면 Invoke-WebRequest
를 사용!
분기처리 예)
PS C:\Users\devToroko> try { $resp = Invoke-WebRequest -Uri 'https://jsonplaceholder.typicode.com/users' ` -SkipHttpErrorCheck -ErrorAction Stop; if($resp.statuscode -eq '200') { ` $jsonContent = ConvertFrom-Json $resp.Content ;` $jsonContent = $jsonContent | ConvertTo-Json -Depth 100;` # pretty print echo $jsonContent; ` Out-File -FilePath '<저장할 디렉토리 경로>\<파일명>.json' ` -Encoding utf8 ` -InputObject $jsonContent; } else { write $res.StatusCode; } } catch [System.Net.Http.HttpRequestException] { write-host "HttpRequestException Occurred code: " "code : " + $_.exception.innerexception.errorcode "message : " + $_.exception.innerexception.message }
참고로 여기 나오는 errorcode 는 이 링크를 참조하시기 바랍니다.
참고
: https://davidhamann.de/2019/04/12/powershell-invoke-webrequest-by-example/
$s = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$c = New-Object System.Net.Cookie('Hello','World','/','httpbin.org')
$s.Cookies.Add($c)
$r = iwr 'http://httpbin.org/cookies' -WebSession $s
(New-Object System.Net.WebClient).DownloadFile("https://velog.velcdn.com/images/dailylifecoding/post/5f6599b9-9197-4b71-8836-46c4b699d86d/image.png", "$pwd\downloaded.png")
./
경로로 시작하면 무조건 User Home 디렉토리 하부에 저장됩니다.$pwd
를 사용해주세요.pwsh 에서 많이 아쉬운 부분이 bash 의 less 기능이다.
하지만 git 을 설치했다면 어느정도 이를 cover 할 수 있다.
git bash 가 사용하는 less.exe 를 그대로 pwsh 에서도 사용하면 된다.
아래처럼 alias 를 주면 끝이다.
Set-Alias -Name "bash-less" -Value "C:\Program Files\Git\usr\bin\less.exe"
참고로 영구적으로 계속 적용하고 싶다면
profile.ps1
에 위 명령어를 기재해둬야 합니다.profile.ps1
가 뭔지 모르겠다면 제가 이전에 작성한 글을 참조하시기 바랍니다.
이건 딱히 pwsh 의 명령어는 아니지만, 굉장히 유용해서 참고용으로 작성했습니다.
명령어 참고문서: https://learn.microsoft.com/ko-kr/windows-server/networking/technologies/netsh/netsh-contexts
외부 요청을 host pc
에서 받는 건 공유기의 포트 포워딩
을 통해서 설정하면 끝이지만,
가끔은 이 외부요청을 다시 host pc
에 생성된 virtual pc
의 특정 [ip + port]
로
포워딩을 해야되는 경우가 있습니다. 이때 알아두면 좋은 게 netsh
입니다.
netsh interface portproxy add v4tov4 `
listenport='<host PC port that listen to external request>' `
listenaddress='0.0.0.0' `
connectport='<virtual pc connection port>' `
connectaddress='<virtual pc ip that exposed to host pc>'
종종 공백(" ")처럼 한번 띄워쓰는 경로에 있는 exe 파일이 있을 수 있다.
ex: C:\Program Files\GDAL\ogr2ogr.exe
이럴때는 Program Files
사이에 있는 공백 바로 왼쪽에 백틱을 넣어주면 된다.
(아래 그림 참고)
찾던 내용이에요 깔끔하게 정리되어있고 명령어 찾기도 편하네요.
powershell 명령어 매번 검색했는데 여기서 찾으면 되겠네요 감사합니다.😊