批处理功能无法正常工作

时间:2013-02-10 02:17:14

标签: batch-file vbscript

前段时间我创建了一个函数,你可以从命令提示符或任何批处理文件中调用它(它只是为了好玩,我看不出它是如何有用的)。它基本上只是让你的(微软)计算机说出你写的任何内容作为参数。 我最近有一些灵感来添加一个开关,它将读取文件的内容。我的独立脚本工作正常,但是当我将它添加到我的函数中时,它并没有像我希望的那样工作。

以下是代码:

@echo off & setlocal enabledelayedexpansion

if "%~1"=="/?" (
    echo.
    echo TALK "Text" [Parameters]
    echo.
    echo Text - The phrase you want to be spoken.
    echo.
    echo [Parameters]:
    echo              /f - Read the contents of a file. "Text" changes to the file path.
    echo.
    endlocal
    exit /b
)

if "%~2 X" equ "/f X" (

    if not exist %~1 (
        echo File does not exist or cannot be found.
        endlocal
        exit /b
    )

    set cont= 
    for /f "delims=" %%i in (%~1) do set cont=!cont! %%i
    :b
    echo Set a = Wscript.CreateObject("SAPI.SpVoice") > "Talk.vbs"
    echo a.speak "%cont%" >> "Talk.vbs"
    start /WAIT Talk.vbs
    del Talk.vbs
    endlocal
    exit /b
)

set text=%~1

echo set speech = Wscript.CreateObject("SAPI.spVoice") > "talk.vbs"
echo speech.speak "%text%" >> "talk.vbs"
start /WAIT talk.vbs
del Talk.vbs
endlocal
exit /b

不幸的是我没有工作功能代码(在我添加/f开关之前)。

对我来说,这是最后的手段,因为我已经对它进行了大量编辑,并搜索了代码,以便了解问题所在。

另一件坏事是我没有注意到我改变了什么,所以我无法准确地告诉你我尝试过的东西。我可以告诉你输出是什么。

我第一次尝试时,它会输出The syntax of the command is incorrect.

现在正处于原始功能(仅将文本转换为语音)不再起作用的程度。文件Talk.vbs(在此过程中生成)的内容为a.speak ""

我会继续更新我的尝试,但是知道我这是非常简单的,我忽略了。

- EDIT-- 根据某人的建议,我将克拉放在语法部分的方括号之前。什么都没有改变。

2 个答案:

答案 0 :(得分:1)

在包含括号的echo语句中,尝试使用carat转义括号。我怀疑if语句中的回声部分得到了字面上的评估。

另一个小建议,我也会替换

start /WAIT Talk.vbs

cscript /nologo Talk.vbs

并不是我认为start /wait导致了错误,但它确实会导致第二个控制台窗口无法正常显示 - 或者无论何时你的脚本执行到目前为止都会出现。

我在这里做了一些其他建议的更改,例如无需a / f开关。如果“%1”是存在的文件的名称,请阅读它。否则,将其视为要阅读的文本。而不是有一个单独的子程序来读取文件而不是从输入中获取文本,所有需要发生的是变量具有不同的值。

@echo off & setlocal enabledelayedexpansion

if "%1"=="/?" ( goto usage )
if "%1"=="" ( goto usage )
if "%1"=="--help" ( goto usage )
if exist "%1" (
    set txt=
    for /f "usebackq tokens=*" %%i in (%1) do set txt=!txt! %%i
) else (
    set txt=%1
)
echo Set a = Wscript.CreateObject^("SAPI.SpVoice"^) > "talk.vbs"
echo a.speak "%txt%" >> "talk.vbs"
cscript /nologo talk.vbs
del talk.vbs
endlocal
goto :EOF

:usage
echo.
echo TALK ["text"^|filename]
echo.
echo talk filename -- speaks the contents of filename
echo talk "text"   -- speaks the supplied text
endlocal
goto :EOF

答案 1 :(得分:1)

除了转义括号外,如果参数为if exist %~1,您还必须在引号中包围"some words I want it to say"。还清理了一下。代码在底部,但首先是解释。

如果您在删除之前查看了talk.vbs,您会看到:

a.speak "!cont! contents of the file here" 

这是因为这段代码:

for /f "delims=" %%i in (%~1) do set cont=!cont! %%i
:b
echo Set a = Wscript.CreateObject("SAPI.SpVoice") > "Talk.vbs"

如果您启用了echo并观察了代码,您会看到最后一个未转义的)正在获取for循环的内容并将其包含在重定向中。

更正并清除了代码:

@echo off & setlocal enabledelayedexpansion
if "%~1"=="/?" (
    echo.
    echo TALK "Text" [Parameters]
    echo.
    echo Text - The phrase you want to be spoken.
    echo.
    echo [Parameters]:
    echo              /f - Read the contents of a file. "Text" changes to the file path.
    echo.
    endlocal
    exit /b
)
set text=
if [%2]==[/f] (
    if exist "%~1" (
        for /f "usebackq delims=" %%i in (%1) do set text=!text! %%i
    ) else (
        endlocal
        exit /B
    )
)
if [%2]==[] set text=%~1

echo set speech = Wscript.CreateObject^("SAPI.spVoice"^) > "talk.vbs"
echo speech.speak "%text%" >> "talk.vbs"
cscript //NoLogo //B talk.vbs
del Talk.vbs
endlocal
exit /b

编辑修复了Andriy M指出的for声明

相关问题