批处理文件:将十进制值赋给变量

时间:2011-02-20 16:22:56

标签: windows audio batch-file

此脚本在OGG文件的目录中运行。

cd c:\dirWithOGG
for %%f in (*.ogg) do (
sox %%f %%f pad 0 "soxi -D %%f"
sox %%f %%f repeat 10
)

我第一次必须创建一个批处理脚本,我认为这很容易。

soxi -D %%f

就它本身而言,上面返回一个十进制值。出于某种原因,它不会从脚本中执行。 sox soxi 位于路径的位置。

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:1)

如果您想使用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

实际上是因为变量我必须将命令移到循环之外。除非启用了延迟扩展并且使用了不同的语法来处理变量,否则它在循环内部将无法正常工作。不过我喜欢它如上所述。

答案 1 :(得分:0)

如果我没记错的话,for要求在同一行上指定操作。请尝试以下方法:

for %%f in (*.ogg) do sox %%f %%f pad 0 "soxi -D %%f" && sox %%f %%f repeat 10

答案 2 :(得分:0)

尝试在头脑中(或在纸面上)展开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以获取更多信息。