簡體   English   中英

Bash 腳本轉換成批處理

[英]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 來分隔名稱和擴展名,但沒有結果。

  1. 我需要做什么才能開始在 windows 這個腳本中工作。
@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM