批处理文件:为变量分配十进制值

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

就它自己而言,上面返回一个十进制值。出于某种原因,它不会从脚本中执行。 soxsoxi 位于添加到 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 以了解更多信息。

【讨论】:

以上是关于批处理文件:为变量分配十进制值的主要内容,如果未能解决你的问题,请参考以下文章

批处理脚本读取一个列表并为每个分配一个变量

批处理文件未将文件内容分配给变量

如何将select的结果分配到sqlplus变量中

在 spark scala 中处理十进制值

C#处理二进制文件,多线程处理

如何将选择的结果分配给 sqlplus 变量