我想使用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
答案 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,则可能是安全的。