【问题标题】:Passing CMD Results to Variable in a Batch File将 CMD 结果传递给批处理文件中的变量
【发布时间】:2025-12-26 07:40:06
【问题描述】:

我正在尝试使用 PSTools 安装应用程序和一组服务,但我想考虑到我尝试连接的计算机可能已关闭或位于不同的网络上,而无法从内部网络。

基本上,如果机器无法通过管理员共享访问,这是我收到的消息:

无法访问 MachineName
找不到网络路径。
确保在 MachineName 上启用了默认的 admin$ 共享。

这是我用来尝试捕获“错误消息”然后报告安装是否成功的语法(取决于它是否可以联系机器)

@echo off
set /p name=What is the machine name?: 
psexec.exe \\%name% -u *useraccount* -p *password* \\ServerName\installation.bat
FOR /F "tokens=*" %%A IN ('COMMAND ^| FIND "Couldn't access"') DO SET Error=%%A
If "%Error%"=="Couldn't access" 
ECHO Installation Failed.
Else
ECHO Installtion complete.  
Pause
exit

目前它在定义错误变量的地方挂起。无法完全弄清楚我在这里出了什么问题。

【问题讨论】:

    标签: variables scripting batch-file


    【解决方案1】:

    'COMMAND ^| FIND "Couldn't access"' 打开一个命令外壳,这就是它挂起的原因。在退出该 shell 之前它不会继续。

    您需要考虑将错误消息重定向到另一个文件。 psexec 行上的2>Errors.txt 将为您提供一个文件,供您在下一行搜索。

    这将使批处理文件看起来像这样:

    @echo off
    set /p name=What is the machine name?: 
    psexec.exe \\\%name% ... \\\ServerName\installation.bat 1>Error.txt 2>&1 
    for /f "tokens=*" %%A in ('FIND /i error.txt "Couldn't Access"') do SET Error=%%A
    If not x%ERROR:Couldn=%==x%ERROR% (
    ECHO Installation Failed.
    ) Else (
    ECHO Installtion complete.  
    )
    Pause
    exit
    

    (另外,请注意使用括号来制作多行 IF)
    检查 if 将查看 Couldn 是否是字符串的一部分,因为直接比较将不起作用,因为您必须检查包括机器名称在内的整个字符串

    【讨论】:

    • 好的,它正在写入文件,但是一旦它到达for /f "tokens=*" %%A in (Error.txt) do SET Error=%%A,它就会关闭。这是我的全部代码::loop cls set /p name=What is the machine name?: psexec.exe \\%name% -u username -p password \\ServerName\path\file.bat 1>Error.txt 2>&1 for /f "tokens=*" %%A in (Error.txt) do SET Error=%%A If %Error% == "The handle is invalid." then Echo Installation Failed. Else ECHO Installation Success. Pause goto loop
    • 一旦你设置了%ERROR% 变量,你应该能够检查它,就像在你的示例批处理文件中一样 - 编辑答案
    • 它将error.txt的最后一行分配为变量:Connecting to computername...。如果该 setence 存在于 error.txt 中,我希望它分配“句柄无效”的值。
    • 更改为 /f 以对错误运行 find 命令。修复了比较(希望)
    • 假设你的 test.txt 是我的 error.txt,它仍然失败。它在变量赋值时关闭。