命令输出设置为变量

Posted

技术标签:

【中文标题】命令输出设置为变量【英文标题】:Command output set as variable 【发布时间】:2022-01-24 00:15:57 【问题描述】:

我一直在尝试制作一个安装当前 nvidia 驱动程序的脚本,我已经走了很远,但还缺少一件事

我正在尝试使用 nvidia-smi 查找驱动程序版本,这是命令输出

C:\>nvidia-smi --query-gpu=driver_version --format=csv
driver_version
457.30

我一直在尝试在 %driver% 中设置 457.30,这就是我目前得到的结果

FOR /F "tokens=* skip=1" %%g IN ('nvidia-smi --query-gpu=driver_version --format=csv') do (SET "driver=%%g")

我也尝试了与 findstr 的组合,但结果是一场灾难

for /F "tokens=* skip=1" %%g in ('nvidia-smi --query-gpu=driver_version --format=csv ^| findstr "."') do set driver=%%g

在任何情况下,%%g 和 %driver% 都会返回 empty

echo %driver% 

返回

C:\>echo
ECHO is on.

有什么想法吗?

感谢您的合作。

【问题讨论】:

您是说运行该代码时没有收到错误消息 不,变量只是空的,echo %driver% 什么都不返回 【参考方案1】:

你的变量没有被设置,因为现在你的nvidia-smi 命令正在抛出一个错误(奇怪的是到标准输出)但是skip=1 正在跳过它,所以没有什么可以设置变量了。

= 是字符串的默认分隔符之一,因此您的命令中的两个 = 符号都需要转义才能正确执行查询。

@echo off
for /F "delims=" %%g IN ('nvidia-smi --query-gpu^=driver_version --format^=csv ^| find "."') do set "driver=%%g"
echo %driver%

【讨论】:

SomethingDark,我只是想确保我不会发疯,并且用户使用的原始代码应该导致错误,并且如果用户从命令行。 @Squashman - 我自己也很惊讶,但nvidia-smi 的错误由于某种原因进入标准输出并被跳过。如果skip=1 不在那里,他们肯定会看到它。 我想我稍后会在我的桌面上运行该代码。有时你只需要亲眼所见就能相信。 是的,现在我自己也确认了,@Squashman。 Invalid combination of input arguments. Please run 'nvidia-smi -h' for help. 当我删除 skip=1 但没有结果时跳过。将 sterr 重定向到 nul 时的事件。 FOR /F "tokens=*" %g IN ('nvidia-smi --query-gpu=driver_version --format=csv 2^>nul') do echo %g 有些程序确实会将它们的错误写入标准输出流,我最近经历了很多。

以上是关于命令输出设置为变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将命令输出设置为批处理文件中的变量

如何将命令输出设置为批处理文件中的变量

将命令的输出设置为批处理文件中的变量[重复]

期望脚本:获取 bash 命令的输出并设置变量

exportLinux中export命令介绍,三种方法设置环境变量

Linux怎么设置系统环境变量之export命令详解