0

単純なバッチファイルをPowerShellスクリプトとして作成するのに苦労しています。

このフォルダ構造を検討してください。クールが含まれているディレクトリに注意してください[1]... ここに画像の説明を入力してください

exiftool.exe
は、(たとえば)埋め込まれたMP3タグから画像を抽出するためのコマンドユーティリティです。さらに情報が必要な場合は
アップロードしました。

oldscript.cmd
exiftool -picture -b input.mp3 > output.jpg
この行は、PowerShellで書き込む行です。著者からの フォーラム投稿で構文を見つけました

  • -picture抽出するタグを-b表し、バイナリモードを表します
  • input.mp3[や]のようなパスに特殊文字を含めることができる私のテストmp3です
  • > output.jpg名前を定義し、結果の画像を同じフォルダに保存します

newscript.ps1
私の現在の最高の機能しないコードは次のとおりです。

$ownpath = Split-Path $MyInvocation.MyCommand.Path
$exe = $ownpath + '\exiftool.exe'
$input = $ownpath + '\input.mp3'
$outimg = $ownpath + '\output.jpg'    

& $exe -picture -binary $input| Set-Content -literalPath $outimg -encoding UTF8

Set-Content「-literalpath」を介したパスで特殊文字を処理できるものを見つけました。ただし、Set-Content(およびOut-Fileメソッドも)は古いバッチパイピング( ">")とは動作が異なるように見えるため、バッチをPowershellスクリプトに変換することはできません。使用するエンコーディングに関係なく、結果の画像は表示されません。上記のヘルプファイルには、exiftoolがUTF8エンコーディングを使用していることが記載されています。

もちろん、他の利用可能なエンコーディングを試しましたが、それらすべてが表示可能な画像を生成できませんでした。私はこの時点で立ち往生しています。したがって、私の最初の質問は、「このバッチファイルをPowerShellに変換するにはどうすればよいですか」という部分がまだ残っています。

では、古いバッチコマンドを使用するとなぜ機能するのでしょうか。

例:フォルダ「D:folder」を作成し、カバー画像を含むこのMP3ファイルを配置します。上からexiftool.exe
を ダウンロードし、そこにも配置します。

古いバッチコマンドが機能し、表示可能な画像が表示されます

D:\folder\exiftool -picture -binary D:\folder\input.mp3 > D:\folder\output.jpg

同じ構文の新しいPowershellV2スクリプトは失敗します。なんで?

& D:\folder\exiftool.exe -picture -binary D:\folder\input.mp3 > D:\folder\output.jpg
4

3 に答える 3

1

私はそれをテストしていませんが、これを試すことができます。なぜなら、私は画像が埋め込まれたmp3を持っていないからです。

$file = & "D:\folder\exiftool.exe" -picture -binary "D:\folder\input.mp3"

[io.file]::WriteAllBytes('D:\folder\input[1].jpg',$file)

編集:

PowerShellコンソールからこの行を使用すると、読み取り可能なイメージが返されます。

 cmd.exe /c "D:\folder\exiftool.exe -picture -binary `"D:\folder\input.mp3`" > image.jpg"

パスおよびファイル名には、次のように特殊文字を使用できます。

 $exe = "c:\ps\exiftool.exe"
 $mp3 = "c:\ps\a[1]\input.mp3" 
 $jpg = " c:\ps\a[1]\image[1].jpg"

 cmd.exe /c "$exe -picture -binary $mp3 > $jpg"

パス内にスペースがあります:

 $exe = "c:\ps\exiftool.exe"
 $mp3 = "`"c:\ps\a [1]\input.mp3`"" 
 $jpg = "`"c:\ps\a [1]\image [1].jpg`""

 cmd.exe /c "$exe -picture -binary $mp3 > $jpg"
于 2013-02-17T08:00:18.800 に答える
0

これを試して:

& $exe -picture -b $input | Out-File -LiteralPath $output

Start-Processを使用して物事を複雑にする必要はありません。exeへのパスを計算し、その結果を文字列に入れるため、call演算子を使用するだけで、&それに続く文字列で指定されたコマンドを呼び出すことができます。

于 2013-02-17T02:03:42.773 に答える
0

これが回避策です。古き良きcmd.exeを完全に回避することはできないようです。
ありがとう@CB行く必要があります

$ownpath = Split-Path $MyInvocation.MyCommand.Path
$exe = $ownpath + '\exiftool.exe'
$input = $ownpath + '\input.mp3'
$output = $ownpath + '\output.jpg'

cmd.exe /c " `"$exe`" -picture -binary `"$input`" > `"$output`" "

ここに画像の説明を入力してください

ノート:

  • このように、すべてのパスに[や]やスペースなどの特殊文字を含めることができます
  • その余分なスペース" `"$exeは重要です。それなしでは動作しません。

set-contentOut-File( ">"を使用した通常のPowershellの方法はエイリアスです)、[io.file]::WriteAllBytesすべてがexiftool.exeユーティリティでは機能しません。私にとっては奇跡です。

于 2013-02-17T18:42:32.890 に答える