[英]Bash script convert into batch
我在 bash 中寫了一個腳本。 該腳本正在制作一個擴展名為.DAT 的文件,該文件從 mp3 文件中獲取詳細信息。 我使用 exiftool 來獲取 id3 標簽。 我有一個名為Miley Cyrus - Wrecking Ball.mp3的 mp3 文件,這個腳本制作文件Miley Cyrus - Wrecking Ball.DAT ,其中包含一些來自 ID3 標簽的詳細信息。
我在 bash 中的腳本。
#!/bin/bash
find . -name '*.mp3' -print0 | while read -d $'\0' file
do
ARTIST=$(exiftool -p '$Artist' "$file")
ALBUM=$(exiftool -p '$Album' "$file")
TITLE=$(exiftool -p '$Title' "$file")
touch "$file".DAT
echo "Lit=" >> "$file".DAT
echo "ENG=" >> "$file".DAT
echo "CRD=" >> "$file".DAT
echo "TIT=$TITLE" >> "$file".DAT
echo "ALB=$ALBUM" >> "$file".DAT
echo "ART=$ARTIST" >> "$file".DAT
done
我需要那個腳本,但是在 windows 中,這開始了我的麻煩。 我不知道我可以從哪種方式開始。 我必須使用哪些選項 for 循環,為什么 exiftool 沒有從文件中獲取標簽? 我嘗試使用 fname 來分隔名稱和擴展名,但沒有結果。
@echo off
setlocal enableDelayedExpansion
for %%a in (*.mp3) do (
set "Title=(exiftool -p Title '%%a')"
set "Album=(exiftool -p Album '%%a')"
set "Artist=(exiftool -p Artist '%%a')"
echo "Lit=" >> "%%a".DAT
echo "ENG=" >> "%%a".DAT
echo "CRD=" >> "%%a".DAT
echo "Title=%Title% >> "%%a".DAT
echo "Album=%Album% >> "%%a".DAT
echo "Artist=%Artist% >> "%%a".DAT
)
exiftool 位於 windows 文件夾中。
我不熟悉exiftool
,所以我無法驗證,但以下應該可以工作:
@echo off
setlocal enabledelayedexpansion
for %%a in (*.mp3) do (
for /f "usebackq delims=" %%b in (`exiftool -p Title '%%a'`) do set "title=%%b"
for /f "usebackq delims=" %%b in (`exiftool -p Album '%%a'`) do set "Album=%%b"
for /f "usebackq delims=" %%b in (`exiftool -p Artist '%%a'`) do set "Artist=%%b"
(
echo Lit=
echo ENG=
echo CRD=
echo Title=!title!
echo Album=!Album!
echo Artist=!Artist!
) > "%%~dpna.dat"
)
注意:如果文件名或字符串包含感嘆號,您會因擴展延遲而遇到問題。
如果您想避免延遲擴展(出於此或任何其他原因),您可以嵌套for
循環並直接使用元變量:
@echo off
for %%a in (*.mp3) do (
for /f "usebackq delims=" %%b in (`exiftool -p Title '%%a'`) do (
for /f "usebackq delims=" %%c in (`exiftool -p Album '%%a'`) do (
for /f "usebackq delims=" %%d in (`exiftool -p Artist '%%a'`) do (
(
echo Lit=
echo ENG=
echo CRD=
echo Title=%%b
echo Album=%%c
echo Artist=%%d
) > "%%~dpna.dat"
)
)
)
)
無需為每個MP3
文件執行三個單獨的EXIFTool
迭代,您應該只需一個即可完成。 除此之外,您不需要首先 select *.mp3
文件,因為EXIFTool
已經可以 select 全部在目錄中。
例如:
@For /F Tokens^=2^,4Delims^=^" %%G In (
'EXIFTool *.mp3 -j -album -artist -title 2^>NUL^|%__AppDir__%find.exe ":"'
)Do @(Set "%%G=%%H"&SetLocal EnableDelayedExpansion&(Echo "Lit="&Echo "ENG="
Echo "CRD="&Echo "TIT=!Title!"&Echo "ALB=!Album!"&Echo "ART=!Artist!"
)>"!SourceFile:~,-4!.DAT"&EndLocal)
假設 output 示例:( 13 Come Said The Boy.DAT
)
"Lit="
"ENG="
"CRD="
"TIT=Come Said The Boy"
"ALB=Just Great Australian Rock Songs Disc 2"
"ART=Mondo Rock"
將其編寫為 pwsh 腳本將允許在 Linux、Mac、Windows 等上運行相同的腳本。 http://www.github.com/PowerShell/PowerShell/
#!/bin/env pwsh
function touch {
Param(
[Parameter(Mandatory=$true)]
[string]$Path
)
if (Test-Path -LiteralPath $Path) {
$NewDate = Get-Date
(Get-Item -Path $Path).LastWriteTime = $NewDate
(Get-Item -Path $Path).LastAccessTime = $NewDate
} else {
New-Item -Type File -Path $Path
}
}
$Cwd = Get-Location
$nl = [System.Environment]::NewLine
Get-ChildItem -Recurse -File -Path $Cwd -Filter '*.mp3' |
ForEach-Object {
$TITLE = & exiftool -charset filename=cp1250 -p '$Title' $_.FullName
$ALBUM = & exiftool -charset filename=cp1250 -p '$Album' $_.FullName
$ARTIST = & exiftool -charset filename=cp1250 -p '$Artist' $_.FullName
$DataFile = Join-Path -Path $_.Directory -ChildPath $($_.BaseName + '.DAT')
if (Test-Path -Path $DataFile) { Remove-Item -Path $DataFile }
touch $DataFile
"Lit=${nl}lENG=${nl}CRD=${nl}Title=$TITLE${nl}Album=$ALBUM${nl}Artist=$ARTIST" |
Out-File -FilePath $DataFile -Encoding ascii
}
我不確定是否需要touch
操作。 如果.DAT
文件存在,它將被覆蓋。 如果它不存在,它將被創建。 如果是這樣...
$Cwd = Get-Location
$nl = [System.Environment]::NewLine
Get-ChildItem -Recurse -File -Path $Cwd -Filter '*.mp3' |
ForEach-Object {
$TITLE = & exiftool -charset filename=cp1250 -p '$Title' $_.FullName
$ALBUM = & exiftool -charset filename=cp1250 -p '$Album' $_.FullName
$ARTIST = & exiftool -charset filename=cp1250 -p '$Artist' $_.FullName
$DataFile = Join-Path -Path $_.Directory -ChildPath $($_.BaseName + '.DAT')
"Lit=${nl}lENG=${nl}CRD=${nl}Title=$TITLE${nl}Album=$ALBUM${nl}Artist=$ARTIST" |
Out-File -FilePath $DataFile -Encoding ascii
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.