如何找到* .css文件进行进一步处理但忽略所有* .min.css文件?

时间:2014-08-12 06:53:11

标签: batch-file

我想使用yui压缩器自动并递归压缩我的js / css文件,其命令类似于以下命令:

for %%f in (*.css) do (
    java -jar d:\projects\yuicompressor-2.4.8.jar -o %%~nf.min.css --charset utf8 --nomunge %%~nf.css
)

然而,问题是,如果我使用上面的循环,当我稍后更新我的css / js文件并再次运行此脚本时,很多文件以 .min.min.css 结尾, .min.min.js 将会制作完成。

如何通过忽略所有* .min.css文件找到* .css文件进行压缩?

修改: 遵循@Magoo关于递归版本的说明

D:\bak\static>compress.bat
java.io.FileNotFoundException: bakstaticstyleSet.min.css:\bak\static\styleSet.cs
s (文件名、目录名或卷标语法不正确。)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at com.yahoo.platform.yui.compressor.YUICompressor.main(YUICompressor.ja
va:208)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.yahoo.platform.yui.compressor.Bootstrap.main(Bootstrap.java:21)

上面的中文句子意味着不正确的文件名,目录名或卷名

这似乎是yui压缩器的错误,而不是批处理脚本。但是有没有任何变化,我可以像cd这样的方式对目录进行递归,做一些事情,然后再回到cd ..

EDIT2:

我运行修改后的脚本,它会递归压缩所有css文件。但是,生成的某些文件名称错误。例子:

check_input.js   --->   CHECK_~1.min.js
jsAddress.js     --->   JSADDR~1.min.js

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%f IN (
 'dir /b /a-d "%sourcedir%\*.css" ^|findstr /v /i /L /c:".min.css"'
 ) DO (
  ECHO(java -jar d:\projects\yuicompressor-2.4.8.jar -o %%~nf.min.css --charset utf8 --nomunge %%~nf.css
)

GOTO :EOF

这可以解决你的问题。

您需要更改sourcedir的设置以适合您的具体情况。

java命令只是echo - 删除验证后的echo( 以激活。


@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%f IN (
 'dir /s /b /a-d "%sourcedir%\*.css" ^|findstr /v /i /L /c:".min.css"'
 ) DO (
  ECHO(java -jar d:\projects\yuicompressor-2.4.8.jar -o "%%~dpnf.min.css" --charset utf8 --nomunge "%%~dpnf.css"
)

GOTO :EOF

递归的修订版。假设java理解引用文件名。如果路径/文件名不包含分隔符(例如 Space ),则不需要引号


@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%f IN (
 'dir /s /b /a-d "%sourcedir%\*.css" ^|findstr /v /i /L /c:".min.css"'
 ) DO (
  PUSHD "%%~sdpf"
  ECHO !cd!
  ECHO(java -jar d:\projects\yuicompressor-2.4.8.jar -o "%%~snf.min.css" --charset utf8 --nomunge "%%~snf.css"
  popd
)

GOTO :EOF

尝试解决递归问题的修订。

我强烈怀疑这个问题与cmd处理得不好的unicode有关。

此版本使用pushd/popd框架将当前目录更改为当前目录。我无法测试unicode,因此使用短名称(由~s运算符调用)可能会有所帮助。

我包含echo !cd!只是为了显示当前目录,无偿地使用我错误地留在原始批次中的setlocal enabledelayedexpansion。我没有使用它(它是我的批处理模板的一部分),它可以省略(但必须在那里使用!var!扩展语法)


我希望有用的补充信息。

通过defauly,每个文件和目录都有两个名称 - “long”和“short”名称。 “short”名称是使用不相关的算法从“long”名称生成的,但它的目的是在原始DOS 8.3命名方案之后创建一个替代名称 - 8个ANSI字符用于名称和扩展名为3,用点分隔。当然,如果名称已经符合8.3约定,则不会创建额外的名称。

您可以通过从提示符执行 dir / x 来查看这些名称。

在批处理中,FOR循环可以提取文件名的一部分。如果%%a是元变量(控制循环的变量),则%%~pa将仅生成目录(“ P ath)”。同样,使用D对于 D 铆钉,N用于 N ame,X用于e X 张力还有其他。请参阅提示中的FOR /?|more以获取更多docco。

要访问short名称(设计为保证ANSI-8.3),请使用~s修饰符,因此%%~sna表示 S hort N 文件"%%a"

Unicode是后来的发明。我希望使用短名称允许cmd处理文件,因为它不是真正为unicode设计的。

由于生成的文件的名称为"%%~snf.css",这意味着来自%%f +“。css”的 s hort n ame, pushd / popd框架实际上使用其短名称将当前目录更改为真实目录。因此,我们在生成新文件时不需要目录名称(因此默认为当前目录),并且文件名称是短名称,因为目标文件规范包含s修饰符。删除s并将其设置为"%%~nf.css"将因此使用原始长名称 - 如果原始文件名称不是unicode,则可能是安全的。