0

수천 개의 파일 이름을 지우고 있습니다. 대부분 "xxxx xxxx - xxxxx xxxx xxxx.yyy"와 같은 구조를 가지고 있습니다. 일부는 대문자로되어 있고 일부는 그렇지 않습니다. (실제로 다른 문제도 있지만 쉽게 해결할 수 있습니다.)FINDSTR을 사용하여 모든 단어를 대문자로 변환하는 방법?

어떤 문자로 된 문자열을 가져 와서 모든 단어 앞에 대문자로 표기하고 싶습니다.
FIND로 할 수있는 것처럼 파일을 사용하는 것이 아니라 파이프를 사용하여 한 줄의 코드를 사용하는 것이 좋습니다.
마지막으로 전체 문자열을 한 번에 대문자로 표시하는 것을 선호하지만 각 단어를 개별적으로 처리하는 것에 반대하지는 않습니다.

예 :
나는 모든 대문자와 알파벳이 아닌 문자를 무시하려는

Input: "this - string IS an EXAMPLE 4 u" 
Output: "This - String IS An EXAMPLE 4 U" 

(대시, 밑줄, 숫자 등), 단지 영향을받지 통해 전달합니다.

for /f "tokens=*" %%x in ('dir /b *.zzz') do ( 
    for /f "tokens=*" %%y in ('echo %%x ^| findstr /r "s/\s\w/\U$&/g;"') do (
     rename "%%x" "%%y")) 

가능하다면, 내가 명령 줄에서 테스트 할 수 있도록하고 싶습니다 :

그래서 나는 다음과 같은 코드를 사용할 수 있도록하고 싶습니다 (제 2 라인은 관련 하나입니다) 이런 식으로 :

echo hello to you | findstr /r "s/\s\w/\U$&/g;" 

내 문제는 위의 예제는 출력을 제공하지 않는다는 것입니다.

알다시피 정규식 예제를 검색했지만 findstr을 사용하여 플러그 앤 플레이로 가져올 수 없습니다.

나는 파일 확장을 대문자로하지 않을 것이지만, 이것은 쉽게 고칠 수 있으므로, 나는 상관하지 않는다.

다른 MS 기반 솔루션 (Enterprise 또는 Ultimate과 함께 제공되거나 Microsoft에서 다운로드 할 수있는 제품)에 대해서는 열려 있지만 sed, grep 또는 기타 제 3 자 소프트웨어 제안은 보내지 마십시오.

미리 감사드립니다.

답변

2

정규 표현식에 대한 FINDSTR 지원은 극히으로 제한됩니다. 명령 줄에서 HELP FINDSTR 또는 FINDSTR /?을 입력하면 의미를 알 수 있습니다. 설상가상으로, 지원되는 정규식 기능은 비표준 방식으로 구현됩니다. What are the undocumented features and limitations of the Windows FINDSTR command?을보십시오. 정규식 제한 사항은 답변의 맨 아래에 설명되어 있습니다. 최종 결과는 FINDSTR이 귀하의 경우 아무런 도움이되지 않는다는 뜻입니다.

저는 PowerShell을 사용하여 원하는 것을 쉽게 수행 할 수 있어야한다고 생각합니다. 그러나 아직 그 언어를 배웠지는 않았습니다. VBScript 또는 JScript를 사용할 수도 있습니다. 세 가지 모두 강력한 정규 표현식을 지원합니다.

정규식을 사용하지 않고 배치 솔루션을 구현하는 것은 어렵지 않습니다.

%%F에 파일 이름 (경로 정보 포함)이 들어있는 경우 %%~nF은 확장자없이 파일 이름 만 제공합니다. %%~xF은 파일의 확장자를 제공합니다. 전체 설명서를 보려면 명령 행에서 HELP FOR을 입력하십시오.

문자열을 대문자로 변환하는 명령은 없지만 다른 FOR 루프를 사용하여 구현하는 것은 간단합니다. SET 명령은 검색 및 바꾸기를 지원하며 검색 부분은 대소 문자를 구분하지 않습니다. 따라서 각 문자를 검색하고 바꿔줘야합니다.

편집
내가 요청한대로 각 단어의 첫 글자를 대문자로 코드를 수정했습니다. 코드는 공간을 단어 경계로 인식합니다. 추가 검색을 추가하고 단어 경계로 지원하려는 각 문자에 대해 op를 바꿔야합니다.

@echo off 
setlocal enableDelayedExpansion 
for %%F in (*.yyy) do (
    set "name= %%~nF" 
    for %%C in (
    A B C D E F G H I J K L M 
    N O P Q R S T U V W X Y Z 
) do set "name=!name: %%C= %%C!" 
    set "name=!name:~1!" 
    echo ren "%%F" "!name!%%~xF" 
) 

는 위의 하나의 잠재적 인 문제를 제외하고 잘 작동 : 그것은 손상됩니다 %%F이 확장 될 때 지연 확장이 활성화되어 있기 때문에 ! 문자가 포함 된 파일 이름. 이 문제는 루프 내에서 지연된 확장 기능을 켜거나 끄기 위해 사용됩니다.

@echo off 
setlocal disableDelayedExpansion 
for %%F in (*.yyy) do (
    set "original=%%F" 
    set "name= %%~nF" 
    set "ext=%%~xF" 
    setlocal enableDelayedExpansion 
    for %%C in (
    A B C D E F G H I J K L M 
    N O P Q R S T U V W X Y Z 
) do set "name=!name: %%C= %%C!" 
    set "name=!name:~1!" 
    echo ren "!original!" "!name!!ext!" 
    endlocal 
) 

위의 두 스크립트는 단순히 실행할 rename 명령을 ECHO합니다. REN 앞에 오는 ECHO를 제거하기 만하면 스크립트가 실제로 파일의 이름을 바꿉니다.

+0

EDIT - 두 번째 솔루션에서 루프 내에서 ENDLOCAL이 누락되었습니다. 모두 고쳐졌습니다. – dbenham

+0

흥미 롭습니다. 그러나 나는 명확하지 않을 것으로 생각한다. 나는 단어를 대문자로 시작하고 싶다. 죄송합니다. 당신의 방법이 나를 생각하게 만들었지 만. 나는 "set nam = % nam : a = A %"와 같은 26 가지 명령을 사용하고있었습니다. 방법을 사용하여 몇 줄로 줄일 수 있는지 알아 보겠습니다. 죄송합니다. 투표 할 담당자가 없습니다. 어쨌든 고마워! –

+0

그냥 투표를 할 담당자를 얻었으므로 그렇게했습니다.^_^ –

관련 문제