前段时间我创建了一个函数,你可以从命令提示符或任何批处理文件中调用它(它只是为了好玩,我看不出它是如何有用的)。它基本上只是让你的(微软)计算机说出你写的任何内容作为参数。 我最近有一些灵感来添加一个开关,它将读取文件的内容。我的独立脚本工作正常,但是当我将它添加到我的函数中时,它并没有像我希望的那样工作。
以下是代码:
@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-- 根据某人的建议,我将克拉放在语法部分的方括号之前。什么都没有改变。
答案 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
声明