当我在远程计算机上运行 PsExec 时,我总是无法得到我想要的结果。在大多数情况下,我的理想情况是 a) 管理服务器上的日志,其中每个单独的日志都具有生成它的远程计算机的名称(例如 COMPNAME1.log、COMPNAME2.log 等)或 b) 每台远程计算机上的日志文件,具有我指定的任何名称。
当我尝试场景(a)时,我使用以下命令。
%SystemDrive%\path\to\psexec.exe @listofcomputers.txt -u DOMAIN\username cmd /c echo TEST >> \\server.company.tld\share\%computername%.log
问题是它从来都不起作用。所有计算机都只写入日志,而日志中%computername%
只有我在办公室中执行 PsExec 的计算机。我想要的是 listofcomputers.txt 中指定的每台计算机的唯一日志,这些日志将正确使用远程环境变量中的主机名而不会出现问题。这可能吗?对我来说似乎不起作用。我试过了,语法明显是错误的。
%SystemDrive%\path\to\psexec.exe @listofcomputers.txt -u DOMAIN\username "cmd /c echo TEST >> \\server.company.tld\share\%computername%.log"
PsExec 失败,提示找不到系统文件(读取:语法失败)。
至于场景 (b),它似乎是类似问题的变体。当我运行这样的命令时,它不起作用。
%SystemDrive%\path\to\psexec.exe @listofcomputers.txt -u DOMAIN\username "cmd /c echo %computername% >> \\server.company.tld\share\aggregated.log"
我对在 cmd.exe 控制台上使用 PsExec 的远程路径和环境变量有什么不明白的地方吗(我甚至还没有尝试过可怕的 PowerShell)。我知道这些东西在批处理文件中可以工作(cmd /c \\server.company.tld\share\runthis.bat
),但是当执行命令作为参数时它不起作用,这是为什么呢?我一直需要这个,却永远得不到它!
答案1
您需要使用插入符号 ^ 进行退出,否则 cmd 会尝试解决该变量。例如,获取远程计算机名称
psexec \\pc cmd.exe /c echo ^%computername^%
答案2
先生们,我终于开始工作了:
psexec \\server cmd.exe /c echo %%计算机名称%%
(注意双百分号)
答案3
电源管理员行政助理(PsExec 替代品)有可选的命令选项来记录它正在做的事情。也许这就是你想要的?
答案4
我意识到已经有一段时间了,但似乎没有人有正确的答案:使用延迟变量扩展。
psexec @listofcomputers.txt -u DOMAIN\username cmd /v /c "echo TEST >> \\server.company.tld\share\!computername!.log"