기 타 배치 파일 질문 드립니다.
2024.02.24 17:32
검색을 해보아도 찾을 수가 없어 질문 드립니다.
C:\내 파일\
위 폴더에 여러 파일이 있다고 가정합니다.
사과.hwp 키위.txt mango.txt 바나나.jpg banana.txt apple.txt 등등...
- 위 경로의 여러 파일들 중, 확장자가 txt인 파일들의 이름만(확장자 없이 파일명만) 불러와서
- 아래 처럼 화면에서만 숫자 순으로 파일명이 표시되게 하고, 번호를 선택하면 해당 파일을 실행할 수 있도록 하려고 합니다.
- 실제 파일명은 변경 없이, 선택 화면에서만 번호 순으로 나타나게 하려고 합니다.
- 이 때 파일 이름만(확장자 제외한)을 변수로 입력 받으려면 배치파일을 어떻게 작성해야 하는지 도움을 요청 드립니다.
----------------------------------------
for 문 - C:\내 파일\ 폴더에서 확장자가 txt인 파일들의 이름만(확장자 없이 파일명만) 불러와서 %변수% 로 저장
메뉴 화면에 번호 순으로 파일명만 출력
1. apple
2. banana
3. mango
4. 키위
5.
.
.
.
set choice=
set /p choice="번호를 선택하세요 : "
echo. %변수% 를 선택하였습니다.
notepad %변수%.txt
-----------------------------------------
댓글 [12]
-
집앞의_큰나무 2024.02.24 19:54
-
가로등 2024.02.24 20:29
선택한 번호에 해당하는 파일만 실행하려고 할 때,
해당 파일명을 반환하는 변수명을 어떻게 작성하는 것인지 잘 모르겠습니다.
올려주신 내용 참고하여 저도 더 검색해보도록 하겠습니다.
글 올려주셔서 감사합니다.
-
메리아 2024.02.24 22:17
본문의 내용을 그대로 chatGPT에 넣어서 얻은 예제입니다.
조금 문제가 있었지만 고쳐보니 잘 동작하는거 같네요.
------------------------------------------------------------------------------------
@echo off
setlocal enabledelayedexpansion
set "folderPath=C:\내 파일\"
set "count=1"
echo. 파일 목록:
echo. ------------
rem 확장자가 txt인 파일들의 이름만(확장자 없이 파일명만) 불러와서 변수에 저장
for %%F in ("%folderPath%*.txt") do (
set "fileName=%%~nF"
echo !count!. !fileName!
set "fileList[!count!]=!fileName!"
set /a count+=1
)
echo. ------------
set /a count-=1
set choice=
set /p choice="번호를 선택하세요 (1-%count%): "
if %choice% geq 1 if %choice% leq %count% (
set "selectedFile=!fileList[%choice%]!"
echo. !selectedFile! 를 선택하였습니다.
notepad "%folderPath%!selectedFile!.txt"
) else (
echo. 올바른 번호를 선택하세요.
)
endlocal
pause
------------------------------------------------------------------------------------ -
가로등 2024.02.24 22:29
올려주신 글 보고, 지금 테스트 해보니 잘 됩니다.
가르쳐 주셔서 많은 도움이 되었습니다.
감사합니다.
-
가로등 2024.02.24 23:25
추가로 한 가지 여쭤봅니다.
위에서 파일명에 느낌표가 들어가 있는 파일인 경우, 목록 출력이나 실행에 문제가 있어서
혹시 느낌표가 들어가 있는 파일도 정상적으로 출력 및 실행하려면
어느 부분 수정이 필요한지 궁금합니다.
-
메리아 2024.02.25 02:07
https://windowsforum.kr/lecture/20421860
그것에 관해 제가 쓴 글이 위에 있는데...제가 쓰고도 헷갈리고 하다보면 또 알던것과 다르게 동작하는 경우가 많습니다.
(특히 느낌표가 처리하려면 제일 고약합니다)
그래서 제가 원래 다른 언어로 알려드릴랬는데, 뭐 별일 있겠나 싶어서 그냥 배치파일로 만들어 드린건데 기어코 문제를 일으키는군요.
배치파일로만 해결하는건 그냥 관리자권한 위한 경로를 처리하며 실행할때나 할만하지,
실제로 사용해야하는
중간의 주요 처리를 다 감안하면서 100% 배치파일로 하는건 정말 할짓 못됩니다.
그러므로 cmd + vbs 형태로 알려드리겠습니다.
-
메리아 2024.02.25 02:11
메인 cmd 파일
------------------------------------------------------------------------------------------------
@echo off
setlocal enabledelayedexpansion
echo.
echo.
cscript "txt만 읽어서 노트패드로 실행하는 예제2_sub.vbs"
echo.
echo.
pause
------------------------------------------------------------------------------------------------
서브 vbs 파일
------------------------------------------------------------------------------------------------
Set objShell = CreateObject("WScript.Shell")
' 경로 설정
' folderPath = "C:\내 파일\"
' 예제용 경로이므로 필요에 따라 적절히 변경하면 됨.
folderPath = objShell.CurrentDirectory & "\"
' 파일 목록 가져오기
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set folder = objFSO.GetFolder(folderPath)
Set files = folder.Files
' 확장자가 txt인 파일들의 이름만(확장자 없이 파일명만) 불러오기
Set txtFiles = CreateObject("Scripting.Dictionary")
count = 1
For Each file In files
If objFSO.GetExtensionName(file.Name) = "txt" Then
fileName = objFSO.GetBaseName(file)
txtFiles.Add count, fileName
count = count + 1
End If
Next
' 파일 목록 출력
WScript.Echo "파일 목록:"
WScript.Echo "------------"
For i = 1 To txtFiles.Count
WScript.Echo i & ". " & txtFiles(i)
Next
WScript.Echo "------------"
' 사용자에게 번호 입력 받기
choice = InputBox("번호를 선택하세요 (1-" & txtFiles.Count & "):")
choice = CInt(choice)
' 선택한 파일 실행
If choice >= 1 And choice <= txtFiles.Count Then
selectedFile = txtFiles(choice)
WScript.Echo selectedFile & " 를 선택하였습니다."
' 파일 실행
objShell.Run "notepad """ & folderPath & selectedFile & ".txt""", 1, False
Else
WScript.Echo "올바른 번호를 선택하세요."
End If
------------------------------------------------------------------------------------------------
txt만 읽어서 노트패드로 실행하는 예제2_sub.vbs
-
메리아 2024.02.25 02:17
여전히 챗GPT가 유용하군요.
vbs로 새로 만들어 달라니까 바로 쏙 뽑아주는군요.
참고로 wscript.exe cscript.exe가 무슨 차이인지 보통 잘 모르는데,
wscript는 윈도우 기준으로, cscript는 텍스트 기준으로 vbscript(.vbs) jscript(.js)를 실행해주는 명령입니다.
다른건 저도 잘 모르겠고,
vbs js 코드 내부에서 wscript.echo라고 했을때
wscript로 실행하면 메시지박스로 뜨고, cscript로 실행하면 cmd창에 바로 echo로 뜹니다.
다만 inputbox는 그러지 못하는거 아닌가 싶긴 합니다만...
참고로 파워셸로 하면 아예 닷넷윈폼을 불러와서 목록을 띄워서 할수도 있습니다만,
그거까지 가면 더 복잡해질거 같아 위 내용을 추천드립니다.
하고 싶으시면 챗GPT로 만들어달라고 해보세요.
다만 챗GPT가 바로 완벽한 코드를 내주는게 아니기 때문에
원하는 결과와 다르면 수정할 능력이 없으면 하기 힘듭니다.
-
메리아 2024.02.25 02:30
잘보니 또 딕셔너리를 만들어줬군요.
이게 무슨 개념인지 잘 이해 안갈수도 있는데
키값과 밸류값을 가지는 자료형 개념입니다.
어렵게 생각할건 아니고
단지 배열의 일종이라 생각하면 되는데
배열은 0,1,2,3,4 .. 이런 숫자로만 배열에서 값을 불러오는데 쓰는데
키-밸류 방식은 키가 숫자도 되고 문자도 되는 방식이라는 차이정도가 있습니다.
(사실 본문은 배열로 해도 되는데 딕셔너리가 확장성 좋으니 갖다 쓴 모양이군요)
이게 딕셔너리 객체 선언이고
Set txtFiles = CreateObject("Scripting.Dictionary")
이렇게 하면 키,밸류가 입력되는 거고
txtFiles.Add count, fileName
호출할때는
selectedFile = txtFiles(choice)
이런식으로 가져오는거죠.
여기서 count와 choice 부분은 다른 용도로 쓰게되면 문자로도 처리가 가능해서 유용한 자료형입니다.
근데 여기선 굳이 필요없는데 어렵게 만들어놨군요.
동적배열을 만들어서 가변배열을 쓰기 번거로워서 그랬나보긴 합니다만...
-
가로등 2024.02.25 02:41
올려주신 글을 읽어보니 매우 복잡한 문제였네요....
바쁘신데 시간내어 주셔서 죄송하고 감사합니다.
예제 파일 보고 잘 배워보도록 하겠습니다.
수고 많으셨습니다. 거듭 감사 드립니다.
-
메리아 2024.02.26 12:51
사실 상황에 따라
느낌표만 처리하면 배치파일만으로도 해결은 가능합니다.
배치파일에서 그런거 다루는게 상당히 귀찮아져서 제대로 처음것은 테스트는 안해봤었습니다만,
결국 테스트해보고 배치파일로만 처리한 것도 샘플로 올립니다.
다만 이건 유니코드 파일명에서 또 막힐 수 있는데
- 가 유니코드 – 가 들어가는 경우가 제법 있습니다.(유튜브 볼때 그런 제목이 종종 있더군요. 유튜브 제목 긁어올때 저런거 종종 걸림.)
- (아스키 0x2D)
– (U+2013)
— (U+2014)
얼핏 같아 보이지만 다른 문자입니다.
(일단 여기서는 길이가 많이 달라보입니다만, 폰트에 따라 그냥 똑같이 생긴 경우 많음
사실 이 글도 쓸때는 1,2번이 달라보이나 댓글등록 완료하고 나서의 폰트는 1,2번이 구분이 안감.)
이것외에도 여러가지 유니코드 파일명이 걸릴수도 있으므로
제대로 커버하고 싶다면 vbs나 기타 유니코드 파일명이 정상적으로 처리되는 언어 사용을 추천합니다.
P.S 막상 해보니 유니코드도 어떻게 되긴 하네요. (표시는 잘 안되는데 예제2번도 cmd창에 표시하므로 마찬가지)
그냥 예제3.cmd로 하셔도 될듯도 하군요.
-
가로등 2024.02.27 12:15
추가로 올려주신 예제를 보고 조금씩 배워보도록 하겠습니다.
거듭 감사드립니다.
구글신 덕분에 리스트 출력은 되는데 메모장으로 순차 실행까지는 아직 모르겠네요
텍스트 리스트 추출.cmd