AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1837371
Accepted
Mr.Key7
Mr.Key7
Asked: 2024-03-31 23:59:32 +0800 CST2024-03-31 23:59:32 +0800 CST 2024-03-31 23:59:32 +0800 CST

一行批量设置变量

  • 772
set var1=Demo
set var2=%var1%
echo %var2%
rem Output:Demo

set var2如果与 一行,为什么下面不起作用set var1?

set var1=& set var2=
set var1=Demo& set var2=%var1%
echo %var2%
rem output:%var1%

我怎样才能set var2从var1一条线上?

更新--- (04/04/2024)

Neil的简单代码

@echo off
set var1=Demo& call set var2=%%var1%%
echo %var2%& pause

DavidPostill延迟了

@echo off
setlocal enabledelayedexpansion
set var1=Demo& set var2=!var1!
echo %var2%& pause

两者都工作正常。

batch
  • 3 3 个回答
  • 406 Views

3 个回答

  • Voted
  1. harrymc
    2024-04-01T00:12:19+08:002024-04-01T00:12:19+08:00

    变量替换是在执行该行之前在整个命令行上完成的。此时,该var1变量尚未定义。

    未定义变量替换的规则是:

    • 如果以交互方式输入变量,则不会进行替换,并且文本保持不变%var1%
    • 如果在批处理文件中使用,该变量将被替换为空字符串。

    您需要将这一行分成两行才能var1 获得值。或者参见@DavidPostill 的回答。

    • 3
  2. Best Answer
    DavidPostill
    2024-04-01T00:54:18+08:002024-04-01T00:54:18+08:00

    set var2如果与 一条线,为什么不起作用set var1?

    正如Harrymc指出的:

    变量替换是在执行该行之前在整个命令行上完成的。此时,该var1变量尚未定义。

    您可以使用延迟扩展来绕过此限制:

    @echo off
    setlocal enabledelayedexpansion
    set var1=Demo & set var2=!var1!
    echo %var2%
    endlocal
    

    例子:

    F:\test>test
    Demo
    

    进一步阅读

    • Windows CMD 命令行的 AZ 索引 | SS64.com
    • Windows CMD 命令(分类) - Windows CMD - SS64.com
    • 解析 - Windows 命令解释器 (CMD.EXE) 如何解析脚本?- 堆栈溢出
    • EnableDelayedExpansion - Windows CMD - SS64.com
    • Endlocal - 本地环境变量 - Windows CMD - SS64.com
    • Setlocal - 局部变量 - Windows CMD - SS64.com
    • 3
  3. Kevin Fegan
    2024-04-01T13:46:15+08:002024-04-01T13:46:15+08:00

    您可以在不使用延迟扩展(没有“ setlocal enabledelayedexpansion”)的情况下,通过使用带有“call”的“for”(循环)来完成此操作。

    @echo off
    set "var1=" & set "var2="
    echo var1=[%var1%], var2=[%var2%]
    
    :rem The one-liner: 
    set "var1=Demo" & for /f "usebackq delims=" %%a in (`call echo ^%var1^%`) do @set "var2=%%a"
    :: 
    
    echo var1=[%var1%], var2=[%var2%]
    :end
    

    输出:

    var1=[], var2=[]
    var1=[Demo], var2=[Demo]
    

    您甚至可以添加第二个“for”循环来在同一行中执行“echo var2”:

    :rem The one-liner: 
    set "var1=Demo" & for /f "usebackq delims=" %%a in (`call echo ^%var1^%`) do @set "var2=%%a" & for /f "usebackq delims=" %%a in (`call echo var2^=[^%var2^%]`) do @echo %%a
    :: 
    :end
    

    “最终”输出:

    var2=[Demo]
    

    以下是“for”和“call”的细分:

    for /f "usebackq" %%a    Operates on a command that is enclosed in `backquotes`. 
                             Executes that command and captures the output of that 
                             command into variable %%a. 
    
    "delims="                Disables all delimiters when parsing the command 
                             output. Default delimiters are "space" and "tab". 
                             Not required for this specific example. 
                             Used when the command output might contain delimiters. 
    
    (`call echo ^%var1^%`) 
    (`call echo var2^=[^%var2^%]`) 
                             Use "call" to execute the echo command within a 
                             separate process. 
    
                             "^" escapes special characters like "%" and "=" when 
                             the command is read by "for". 
    
     do @set "var2=%%a" 
     do @echo %%a            Sets the variable "var2" from the output of the 
                             command in the for loop. 
    
    
                             In this case, the for command will execute just once. 
    
                             If the output of the command spanned multiple lines, 
                             the for command would execute once for each non-empty 
                             output line. 
    
    • 2

相关问题

  • 从命令行计算具有特定扩展名 (.mp4) 的文件夹和子文件夹中的文件

  • Windows批处理文件最小化所有打开的窗口

  • Windows 批处理更改所有 IIS 应用程序池超时

  • 命令行:文件重命名的通用命令

  • Python 的“pass”参数的批处理等价物是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve