1

ディレクトリ パスをパラメーターとして使用するバッチ ファイルがあります。

そのファイル フォルダーには、jpg に変換する必要がある .ai.pdf または .pdf ファイルがいくつもあります。変換は私の問題ではありません (私は imageMagick を使用しています) が、完全な拡張子を削除することは問題です。

ファイル名から完全な .ai.pdf (7 文字) または .pdf (4 文字) を削除して .jpg に置き換えることができる必要があります。 for ループで ~n だけを使用することはできません。 .ai.pdf があるインスタンスで .ai を削除します (ファイル名だけが必要なファイル名.ai になります)

この StackOverFlow の例については、StackOverFlow に関するかなりの数の投稿があります。

しかし、何をしようとしても、ファイル名から適切な量の拡張子を切り捨てるとエラーが発生します。

これが私のコードです。これは私がこれまでに作成した最初の主要なバッチ ファイルであるため、作業を行うためのプログラムをさらにインストールする以外は、何でも受け入れます。

私を殺したのは、これが機能していて、あるサーバーから別のサーバーへのシャッフルと1週間の休暇で、作業コードが....置き違えられたことです。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set dir1=%1
echo recieved !dir1!
for /R %dir1% %%a in (*.pdf) DO ( 
  echo file found !a!
  set b=th_%%~nxa
  if x%b:ai.pdf=%==x%b% set b=%%~dpa!b:~0,-7!
  if not x%b:ai.pdf=%==x%b% set b=%%~dpa!b:~0,-4!

  REM convert -density 64 "%%a" +matte -resize 15%% "!b!.jpg"
  @echo !b! converted
)

ENDLOCAL

ファイルは %~dpa!b:~0,-7!と教えてくれます。は無効な置換です

何か案は?助けてくれてありがとう!

4

2 に答える 2

6

最初にいくつかのこと:

!a!%%aは 2 つの異なる変数です。

if x%b:ai.pdf=%==x%b%あなたが思っていることを意味するものではありません。が含まれ%b%ていない場合にのみ当てはまります.ai.pdf

繰り返しますが、if not x%b:ai.pdf=%==x%b%あなたが考えていることを意味するものではありません。これは、%b% DOESに が含まれている場合に当てはまります.ai.pdf

検証やカットを行う必要はなく、検索して置き換えるだけです。(これが%y:x=z%表記法です。この例では、x内のすべて%y%を aに置き換えzます。) 検索と置換で検証を行います。検索に一致するものだけを置き換えます。これにより、バッチ ファイルが高速化されます。

最後に、コード ブロック内にいるため、ステートメント()でオンになっている遅延展開を使用する必要があります。setlocalこれは、コード ブロック内のすべてが 1 行であるかのように扱われるためです。つまり、コード ブロック内の変数を変更すると、% 表記を使用して新しい値を確認できなくなります。%代わりに、をに置き換える必要があります!。例えば...

setlocal enableDelayedExpansion
set x=Hello
(
  set x=Goodbye
  echo I don't know why you say "!x!", I say "%x%".
)

...古いビートルズの歌詞を教えてくれます...

I don't know why you say "Goodbye", I say "Hello".

とにかく、あなたの答えに:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set dir1=%1
echo recieved !dir1!
for /R %dir1% %%a in (*.pdf) DO ( 
  :: Adding a colon to the end of the filename allows the extension to be ID'd
   : without explicitly looking at it with an IF statement, while simultaneously
  :: avoiding similar looking character groupings inside the filename.
  set b=th_%%~nxa:
  :: No need to check for case, the substitution will do that for you.
  set b=!b:.ai.pdf:=.jpg!
  set b=!b:.pdf:=.jpg!

  REM convert -density 64 "%%a" +matte -resize 15%% "!b!"
  echo %%a converted into !b!
)

ENDLOCAL

欠点は、両方のファイル...

X.ai.pdf
X.pdf

... に変換されth_X.jpg、2 つの異なるファイルのファイル名が重複する可能性があります。

しかし、それは両方のタイプのファイル名を同じように扱うというあなたの概念に内在しています。この種の重複を回避する方法がない場合は、 をファイルに残して、と.aiの 2 つのファイルを作成し、ファイル名が重複する可能性をなくすことも悪くないでしょう。th_X.jpgth_X.ai.jpg

于 2012-09-22T06:15:30.013 に答える
0

うーん...これはあなたのために働くでしょうか:
for /R %F in (*.pdf) do @for %G in ("%~nF") do @echo %~nxF ==^> %~nG.jpg
(cmdから直接実行されるように、バッチから実行される場合は、に置き換え%%%ください)。
これには、ファイルのベース名と同じ名前のファイルが存在する場合、ファイルの大文字と小文字をディレクトリの大文字と小文字に変更するという独特の効果があります (たまたま というサブディレクトリがある場合file.pdfは になります)が、それだけです (私は思う)。FILE.jpgFILE

これは、ベース名が異なることも前提としています(したがって、同じディレクトリにありませfile.ai.pdffile.pdf

于 2012-09-21T21:45:49.370 に答える