该脚本从OGG文件的目录中运行。
cd c:\dirWithOGG for %%f in (*.ogg) do ( sox %%f %%f pad 0 "soxi -D %%f" sox %%f %%f repeat 10 )
第一次我不得不创build一个批处理脚本,我认为这很容易。
soxi -D %%f
在它自己,上面返回一个十进制值。 出于某种原因,它不会从脚本中执行。 sox和soxi都在PATH的位置。
任何帮助表示感谢,谢谢。
如果你想使用soxi -D %%f
的输出作为sox
的命令行参数,你可以这样做:
FOR %%f IN (*.ogg) DO CALL :runsox "%%f" GOTO :EOF :runsox soxi -D %1>tmpfile SET /P decvalue=<tmpfile sox %1 %1 pad 0 %decvalue% sox %1 %1 repeat 10
正如你所看到的,循环内部的命令已经被移到了循环调用的子程序中。 除此之外, soxi
的输出被重定向到一个文件,然后被读入一个变量,然后被用来将值传递给sox
。
实际上是因为我不得不将这些命令移到循环之外。 它将在循环内部不正确地工作,除非启用延迟扩展,并使用不同的语法来解决变量。 尽管如此,我更喜欢它的实现。
如果我没有记错, for
要求在同一行上指定动作。 尝试以下操作:
for %%f in (*.ogg) do sox %%f %%f pad 0 "soxi -D %%f" && sox %%f %%f repeat 10
尝试在头上(或在纸上)展开FOR
:
FOR %%F IN (*.ogg) DO ( sox %%F %%F pad 0 "soxi -D %%F" sox %%F %%F repeat 10 )
如果你有一个.ogg
文件,说foo.ogg
,那么FOR
循环会导致执行下面两个语句。
sox foo.ogg foo.ogg pad 0 "soxi -D foo.ogg" sox foo.ogg foo.ogg repeat 10
我不认为第一行会做你期望的。 它将运行sox
并传递行的其余部分作为参数。 它不会执行soxi -D foo.ogg
并将其替换为输出。 DOS不能以这种方式工作。 尝试像这样:
SETLOCAL EnableExtensions FOR %%F IN (*.ogg) DO ( FOR /F %%N IN ('soxi -D %%F') DO ( sox %%F %%F pad 0 "%%N" sox %%F %%F repeat 10 ) ) ENDLOCAL
这可能工作。 我没有访问DOS框,所以我可能有内部FOR
语法错误。 您可能必须使用反引号或双引号指定子命令。 FOR
循环的增强版本需要启用IIRC的命令扩展。 尝试输入FOR /?
请在命令提示符处或给http://www.computerhope.com/forhlp.htm阅读以获取更多信息。