2012-09-21 94 views
1

我有一个批处理文件,它将目录路径作为参数。用于循环字符串替换的批处理文件

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

我需要能够从文件名中取出完整的.ai.pdf(7个字符)或.pdf(4个字符)并替换为.jpg我不能在for循环中使用〜n因为它不会在.ai.pdf中产生.ai.pdf(结果在文件名.ai中,我只需要文件名)

关于这个 在StackOverFlow上有不少文章StackOverFlow Example

但无论我尝试尝试什么,在从文件名截断适当的扩展名时,出现错误。

这是我的代码。这是我创建的第一个主要批处理文件,因此我对任何东西都是开放的,除了安装更多的程序来完成这项工作。

杀死我的事情是,我有这个工作,并在从一台服务器到另一台洗牌,一个星期的假期,工作​​代码得到了....错位。

@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!是无效的替代

任何想法?谢谢您的帮助!

+1

这是关于我认真考虑使用其他(任何其他)脚本语言的一点。真令人恼火的是,如何在cmd脚本中做这样的事情令人费解。 –

+0

使用!可变扩展,而不是% –

回答

5

有几件事情第一:

!a!%%a是两个不同的变量。

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%表示法的作用,在此示例中,它用z替换%y%内的每个x。)让搜索和替换进行验证。它只会替换与搜索相匹配的内容。这会加快你的批处理文件。

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

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,消除了重复文件名的可能性。

+0

我非常喜欢没有if检查的字符串替换的简单性。这是一种干净,可以理解的做我想做的事情的方式。如果我能解释%%和!的话,我会+5你。谢谢! –

+0

我唯一需要改变的是添加SET b = %%〜dpa!b!保持转换程序转换为相同的路径。再次感谢! –

0

唔...将这项工作对您:
for /R %F in (*.pdf) do @for %G in ("%~nF") do @echo %~nxF ==^> %~nG.jpg
(如直接从CMD执行,如果从批量运行,更换%%%)。
如果文件的大小写与文件的基本名称相同(file.pdf将变为FILE.jpg,如果您碰巧有一个名为FILE的子目录),则会将文件大小写更改为目录大小的特殊效果,但就是这样(我认为)。

这还假定你的基地名称不同(所以没有file.ai.pdffile.pdf在同一目录下)

+0

这种方法的缺点是它将删除所有“次要扩展”以及“.AI”。所以** **'Bla.ai.pdf'和'Bla.anythingAtAll.pdf'都会变成'Bla.jpg'。 –

+0

好点 - OTOH,它简化了简化的步骤 – wmz

相关问题