如何将PowerShell命令输出赋值给变量,实现Mac端curl导出TOKEN的同等效果
Windows 命令行赋值命令输出到变量的常见问题说明
你之前在mac上使用的是类Unix shell的语法,Windows原生的命令行环境语法规则和类Unix shell完全不兼容,使用>尝试赋值本身就是语法错误,>在Windows所有常用shell中都是将输出重定向写入文件的作用,和变量赋值无关。
接下来分不同环境给出对应正确写法:
1. 适用于Windows cmd(命令提示符)的写法
:: 如果是写.bat/.cmd批处理文件使用以下语法 for /f "delims=" %%i in ('curl.exe --header "Metadata-Flavor: Google" --get --data-urlencode "audience=http://vault/%ROLE%" --data-urlencode "format=full" "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity"') do set TOKEN=%%i
注意事项:
- 如果是直接在cmd窗口手动执行命令,把
%%i替换为%i - 变量引用格式为
%变量名%,和类Unix的${变量名}不同 - 必须调用
curl.exe而非curl,避免和部分Windows版本中curl的别名冲突
2. 适用于Windows PowerShell的写法
$TOKEN = curl.exe --header "Metadata-Flavor: Google" --get --data-urlencode "audience=http://vault/$env:ROLE" --data-urlencode "format=full" "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity"
注意事项:
- PowerShell默认将
curl作为Invoke-WebRequest命令的别名,该命令参数和原生curl完全不兼容,必须加.exe后缀调用原生curl程序 - 环境变量引用格式为
$env:变量名,例如示例中的$env:ROLE
3. 适用于WSL/Git Bash等类Unix模拟环境的写法
这类环境完全兼容类Unix shell语法,你原本在mac上使用的命令可以直接运行:
export TOKEN="$(curl --header "Metadata-Flavor: Google" --get --data-urlencode "audience=http://vault/${ROLE}" --data-urlencode "format=full" "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity")"
你遗漏的核心操作要点
- 没有确认当前使用的shell环境,错误混用不同体系的shell语法
- 没有处理Windows平台curl的别名冲突问题,导致命令执行结果不符合预期
- 错误使用
>符号做变量赋值,该符号仅用于文件重定向,无变量赋值作用 - 没有按照对应shell的要求调整变量引用格式
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

