1

我有一个将目录路径作为参数的批处理文件。

在该文件夹中,我需要将任意数量的 .ai.pdf 或 .pdf 文件转换为 jpg 文件。转换不是我的问题(我正在使用 imageMagick),但删除完整的扩展是。

我需要能够从文件名中删除完整的 .ai.pdf(7 个字符)或 .pdf(4 个字符)并将其替换为 .jpg 我不能在 for 循环中仅使用 ~n,因为它不会在有 .ai.pdf 的实例中删除 .ai(导致文件名.ai,我只需要文件名)

StackOverFlow 上有很多关于这个 StackOverFlow 示例的帖子

但无论我尝试什么,在从文件名中截断适当数量的扩展名时都会出错。

这是我的代码。这是我创建的第一个主要批处理文件,所以我对任何事情都持开放态度,除了安装更多程序来完成这项工作。

杀死我的事情是,我有这个工作,并且在从一台服务器到另一台服务器的洗牌和一周的假期中,工作代码被......放错了位置。

@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是两个不同的变量 。

if x%b:ai.pdf=%==x%b%并不意味着你认为它的作用。仅当%b%不包含时才会如此.ai.pdf

再次,if not x%b:ai.pdf=%==x%b%并不意味着你的想法。当%b% 包含.ai.pdf. _

不需要做任何验证和切割,只需搜索和替换。(这就是%y:x=z%符号的作用,在本例中,它用 . 替换了每个inside x。)让 search 和 replace 进行验证。它只会替换与搜索匹配的内容。这将加快您的批处理文件。%y%z

最后,由于您在()代码块中,因此您需要在setlocal语句中使用延迟扩展。这是因为代码块中的所有内容都被视为在一行中。这意味着如果您更改代码块内的变量,您将无法使用 % 表示法看到新值。相反,您需要将%'s替换为 ' !s。例如...

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,从而为两个不同的文件创建重复文件名的可能性。

但这是您将两种类型的文件名视为相同的概念所固有的。如果您没有避免这种重复的方法,那么将 保留.ai在文件上可能不是一个坏主意,从而创建两个文件: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.pdf并且file.pdf在同一目录中)

于 2012-09-21T21:45:49.370 回答