批处理文件:为变量分配十进制值
Posted
技术标签:
【中文标题】批处理文件:为变量分配十进制值【英文标题】:batch file: assign decimal value to variable 【发布时间】:2011-02-20 16:22:56 【问题描述】:此脚本在 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 位于添加到 PATH 的位置。
任何帮助表示赞赏,谢谢。
【问题讨论】:
"soxi -D %%f"
应该如何运行?是sox
还是你的意思是它由cmd
shell 运行并且它的输出被替换为sox
的另一个参数?
【参考方案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
。
实际上是因为变量,我不得不将命令移到循环之外。除非启用延迟扩展并且使用不同的语法来寻址变量,否则它将在循环内不正确地工作。不过,我更喜欢它按上述方式实现。
【讨论】:
是的,输出soxi -D %%f 是sox的参数。脚本有效,谢谢。【参考方案2】:如果我没记错的话,for
要求在同一行指定操作。请尝试以下操作:
for %%f in (*.ogg) do sox %%f %%f pad 0 "soxi -D %%f" && sox %%f %%f repeat 10
【讨论】:
不一定。基本上,milowas 的语法在那里是正确的。这是不同的东西,可能与"soxi -D %%f"
作为参数有关。【参考方案3】:
尝试在您的脑海中(或在纸上)扩展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 以了解更多信息。
【讨论】:
以上是关于批处理文件:为变量分配十进制值的主要内容,如果未能解决你的问题,请参考以下文章