SharedIT | 묻고 답하기(AMP)

powershell(파워쉘)로 프로그래밍이 가능할까요?

파워쉘에서 disk volumn을 readonly로 하고자 합니다. 

(C#으로 하려고 했는데, 못 찾아서 그런지 관련 함수가 없네요)

절차는 아래와 같이 하면 되는것으로 알고 잇는데, 중간에 select volume을 선택하는 과정에 로직을 넣으려고 하는데 가능할까요?


  • 1.diskpart

  • 2.list volume

  • 3.select volume 숫자 (여기에서  D드라이브 레이블 선택 로직 필요)

  • 4.attributes disk set readonly


Tags : 태그가 없습니다.

5개의 답변이 있습니다.

우애오옹
  0 추천 | 3년 이상 전

$input = Read-Host -Prompt "드라이브 문자열 입력"

Get-Volume -DriveLetter $input | Get-Partition | Get-Disk | Set-Disk -isReadOnly $true

로 해결 가능할 것 같습니다

일괄적으로 d드라이브에 하신다면 Get-Volume의 $input를 "D"로 교체하기만 하면 될것 같습니다

wansoo
  0 추천 | 3년 이상 전

batch file을 아래와 같이 만들어서 관리자 모드로 실행 시켜 주면 되겠네요.


@echo off

for /f "tokens=1-5 delims= " %%a in ( '^( echo list volume ^& echo exit ^) ^| diskpart ^| findstr Volume' ) do if %%c equ D ( set d_no=%%b )

( echo select volume %d_no% & echo attributes disk set readonly & echo exit ) | diskpart



c# 등의 프로그램언어에서 사용하려면 shell 명령으로 위에서 만든 batch file을 실행 시켜 주면 되겠고요.


명령문을 간단히 설명해 보면,

for /f "tokens=1-5 delims= " %%a in ( '^( echo list volume ^& echo exit ^) ^| diskpart ^| findstr Volume' ) do if %%c equ D ( set d_no=%%b )

는  D 드라이버에 해당하는 볼륨 숫자값을 찾아서 환경변수 d_no에다 저장하고요.

다음의 

( echo select volume %d_no% & echo attributes disk set readonly & echo exit ) | diskpart

명령을 수행해서 드라이버 볼륨을 선택한 후에 선택한 드라이버 볼륨을 읽기 전용 속성으로 변경 시켜 주게 됩니다.

wansoo
  0 추천 | 3년 이상 전

방법이 있을 것 같아 보이네요~

이건 Powershell에 국한해서 보기 보다는 diskpart  명령의 활용 방법에 대한 문제라고 보면 될 것 같고요.

PowerShell이 아닌, cmd나 batch file에서 가능한 방법을 diskpart에서 기능을 제공해 주냐 안하냐의 문제로 보여지네요.

diskpart가 아닌 다른 명령으로 해당 설정을 할수 있다면 다른 명령을 통해서 하는 방법도 있겠고요.

diskpart에서 command line에서 추가 명령을 지정해서 수행이 가능하도록 지원해 준다면 C냐 C#이나 자바냐, 파이썬이냐 따질 필요없이 shell 명령으로 diskpart 명령을 호출해서 처리하면 되겠고요.

가능 방법이 있는지 한번 찾아 보고 다시 답변을 달 수 있도록 해 볼께요~ ^^;;


wansoo | 3년 이상 전

일단...

관리자 계정으로 CMD 창이나 PowerShell 창을 열고..

명령줄에 아래와 같이 적고 실행 시키면

( echo list volume & echo exit ) | diskpart | findstr Volume

Volume List들을 화면에 표시할 수 있겠네요.

여기서 D드라이브에 해당하는 두번째 칼럼의 숫자를 찾아서 

diskpart로 select Volume 명령을 실행 시키고

해당 볼륨의 속성 값을 readonly로 처리하면 될 거 같은데...


지금은 급하게 가봐야 할 곳이 있어서... ㅎㅎㅎ

나중에 추가적인 방법을 찾아서 다시 올릴 수 있도록 해 볼께요~ ^^;;ㅔ

wansoo | 3년 이상 전

PowerShell과 cmd의 처리 방법에 차이가 있어서 PowerShell에서는 작동이 되지 않네요.

PowerShell을 자주 사용하지 않다보니... 착각했어요.

PowerShell에서는 PowerShell에 맞는 문법과 표현법을 적용해서 처리해야 되겠지만, 기본 처리 방법에는큰 차이가 없을 것 같네요.

양성환
  0 추천 | 3년 이상 전

이렇게도 가능하구요


Process p = new Process();

p.StartInfo.UseShellExecute = false;

p.StartInfo.RedirectStandardOutput = true;

p.StartInfo.FileName = @"C:\Windows\System32\diskpart.exe";

p.StartInfo.RedirectStandardInput = true;

p.Start();

p.StandardInput.WriteLine("select disk 2");

p.StandardInput.WriteLine("clean");

p.StandardInput.WriteLine("create partition primary");

p.StandardInput.WriteLine("select partition 1");

p.StandardInput.WriteLine("format fs=fat32 quick");

p.StandardInput.WriteLine("active");

p.StandardInput.WriteLine("assign");

p.StandardInput.WriteLine("exit");

string output = p.StandardOutput.ReadToEnd();

p.WaitForExit();

양성환
  0 추천 | 3년 이상 전

C#함수가아닌 윈도함수 및 쿼리로하셔야해요.

권한상승도시켜야할듯