【问题标题】:Variable assignment problem in DOS batch file for loopDOS批处理文件for循环中的变量赋值问题
【发布时间】:2010-09-06 08:54:21
【问题描述】:

我在 DOS 脚本 for 循环中有一个变量分配问题。它从不分配值,它始终为空白。下面是示例代码

@echo off
set ans=%1
SET STRING=%ans:"=%

echo Parsing the string "%STRING%":
for /f "tokens=1-2" %%a in ("%STRING%") do (
 set Word1 =%%a
 echo Word 1: %%a
 echo Word 1: %Word1%
 set Word2 =%%b
 if %%b.==. (Set server =\\.\pipe\mssql$microsoft##ssee\sql\query ) else (Set server =%%b)
)
echo Server name "%server%"
sqlcmd -s %server%

%%a 的值未分配给变量 Word1。但是当我回显 %%a 时,它显示了正确的值。同样在最后一个空值检查条件中,服务器变量从未设置。我在这里很困惑。有人可以帮帮我吗?

P.S: 脚本的输入是任意 2 字字符串(例如:a.bat "l dev-server")

【问题讨论】:

    标签: batch-file dos


    【解决方案1】:

    您需要使用延迟扩展 - !Word1! 而不是 %Word1%

    默认情况下,当 shell 第一次读取语句时,所有变量都被替换为它们的当前值,并且每次命中该行时都会使用修改后的语句。这就是 DOS 的工作原理,它在 Windows shell 中保持这种方式以实现向后兼容性。

    另一方面,延迟扩展会在每次命中语句时重新插入值。这会给你想要的结果。

    【讨论】:

    • 请注意,正如本页 ss64.com/nt/setlocal.html 中所述,默认情况下不启用延迟扩展。要启用它,您需要在脚本中添加这一行:SETLOCAL EnableDelayedExpansion
    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多