![일괄적으로 파일에서 텍스트를 찾은 다음 파일 이름을 바꿉니다.](https://rvso.com/image/1638143/%EC%9D%BC%EA%B4%84%EC%A0%81%EC%9C%BC%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%B0%BE%EC%9D%80%20%EB%8B%A4%EC%9D%8C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
폴더 안의 각 파일에서 특정 텍스트를 찾고, 해당 텍스트 뒤의 내용을 가져와 파일 이름으로 설정하는 스크립트를 만드는 데 문제가 있습니다. 이 모든 작업은 루프 내에서 여러 파일에서 동일하게 수행됩니다. .
예를 들어, file1, file2, file3이 포함된 폴더가 있습니다.
content in file1: sw_part = "ABC-DEF.GHJ";
content in file2: sw_part = "ABC-123.XYZ";
content in file3: sw_part = "ABCDE-FGHJ.KLMN";
결과는 다음과 같습니다.
file1 renamed to ABC-DEF.GHJ
file2 renamed to ABC-123.XYZ
file3 renamed to ABCDE-FGHJ.KLMN
내가 만든 것은 이것이다:
for /F "tokens=2 delims==" %%a in ('findstr /I "sw_part" file1') do set "swpart=%%a"
echo sw part is: %swpart%
copy file1 "%swpart%"
이것은 잘 작동하지만 주어진 파일에 대해서만 작동하며(루프를 사용하여 작동하도록 만들 수는 없습니다) 또한 다음과 같이 파일 이름을 바꿉니다.;
마지막에. 도움이 필요하세요?
BATCH로 수행해야 합니다. 파워셸도 괜찮습니다.
감사해요
답변1
다음 스크립트는 원하는 작업을 수행합니다.
cd C:\temp\swpart
$files = [System.Collections.ArrayList]@()
select-string -Path "*.*" -Pattern "sw_part" | ForEach-Object {
$old_filename = $_.Filename
$new_filename = $_.line -replace "^.*sw_part = ""","" -replace """.*$",""
# put everything in array, so the files get closed and can be renamed later.
$null = $files.Add(@{"old"=$old_filename;"new"=$new_filename})
}
$files |ForEach-Object{
$old_filename = $_.old
$new_filename = $_.new
rename-item $old_filename $new_filename -Force
}
파일이 있는 경로로 변경하려면 첫 번째 행을 변경해야 합니다.
어떤 이유로 인해 모든 파일의 이름이 바뀌지 않은 경우 스크립트를 다시 실행하십시오. 그런 다음 파일이 여전히 사용 중이었습니다.
답변2
- PowerShell을 사용하면 다음 두 줄만 사용하여 이 작업을 수행할 수도 있습니다.
ls 'F:\2020-SU\Q1605996\*.txt'|%{$new=(cat $_.FullName).split('\"*\"')[-2];ren $_.FullName -new $new -force}
- 별칭을 사용하지 않고:
Get-ChildItem 'F:\2020-SU\Q1605996\*.txt' | ForEach {
$new=(Get-Content $_.FullName).split('\"*\"')[-2]
Rename-Item $_.FullName -new $new -force
}
- cmd를 사용하여 한 줄로 이 작업을 수행할 수도 있습니다.
명령줄에서:
for /f tokens^=1-3delims^=^:^"^" %a in ('findstr . *.txt')do @ren "%~fa" "%~c"
bat/cmd 파일에서:
@echo off
cd /d "C:\Path\To\Your\Folder"
for /f tokens^=1-3delims^=:^"^" %%a in ('findstr . *.txt')do @ren "%%~fa" "%%~c"
Findstr
명령과 출력
>F:\Q1605996>findstr . *.txt
file1.txt:sw_part = "ABC-DEF.GHJ";
file2.txt:sw_part = "ABC-123.XYZ";
file3.txt:sw_part = "ABCDE-FGHJ.KLMN";
file4.txt:sw_part = "ABCDE-FGHJ.KXMN";more test/strings
file5.txt:this is a test; sw_part = "fea.geow.eaf.gae"; this is another test;
For
루프 명령 메커니즘
set yours delimiters : + " + " ==>> delims^=:^"^"
set yours tokens "1" - "3" ==>> tokens^=1-3
: = ;
token = 1:token =2= token = 3;
file1.txt:sw_part = "ABC-DEF.GHJ" ;
file2.txt:sw_part = "ABC-123.XYZ" ;
file3.txt:sw_part = "ABCDE-FGHJ.KLMN";
file4.txt:sw_part = "ABCDE-FGHJ.KXMN";more test/strings
| | | |
ren "%f~a" "%~c"
ren "F:\Q1605996\file1.txt" "ABC-DEF.GHJ"
ren "F:\Q1605996\file2.txt" "ABC-123.XYZ"
ren "F:\Q1605996\file3.txt" "ABCDE-FGHJ.KLMN"
ren "F:\Q1605996\file4.txt" "ABCDE-FGHJ.KXMN"
rem :: The same in file5.txt
file5.txt:this is a test;sw_part = "fea.geow.eaf.gae"; this is another test;
| | | |
ren "%f~a" "%~c"
ren "F:\Q1605996\file5.txt" "fea.geow.eaf.gae"
추가 리소스 PowerShell:
Split()
Replace()
Substring()
Rename-Item
|ren
ForEach-Object
|%
|?
Get-Content
|type
|cat
Get-ChildItem
|ls
|dir
추가 리소스 cmd/배치: