问题

问题

我看过各种建议(ss64.com 命令重定向) 和技巧,但找不到我的问题的答案:

问题

是否可以将我要执行的命令导入到我将要创建的相同重定向输出中?

使用 netstat 的示例

输入命令

C:\Users\memyselfandi> netstat -obna >C:\temp\netstat_with_programs.txt

实际命令如下:netstat -obna >C:\temp\netstat_with_programs.txt

输出(文本文件 netstat_with_programs.txt)

这是文件的实际内容netstat_with_programs.txt。(该命令基本上在输出文件中记录其自身。

netstat -obna >C:\temp\netstat_with_programs.txt
Active connections

  Proto  Local Address          Remoteaddress          State             PID
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING         888
  RpcSs
 [svchost.exe]
  TCP    0.0.0.0:2382           0.0.0.0:0              LISTENING         1396
 [sqlbrowser.exe]
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING         376
  TermService
 [svchost.exe]
....

arp 示例

输入命令

C:\users\memyselfandi> arp -a >C:\temp\arp_output.txt

实际命令是:arp -a >C:\temp\arp_output.txt

输出(arp_output.txt的内容)

这是文件的实际内容arp_output.txt。(该命令基本上在输出文件中记录其自身。

arp -a >C:\temp\arp_output.txt
Interface: 10.57.209.191 --- 0x5
  Internet Address      Physical Address      Type
  10.57.209.2           80-e0-1d-58-8a-50     dynamic 
  10.57.209.3           80-e0-1d-58-8b-88     dynamic 
  10.57.209.9           00-50-56-8d-91-fe     dynamic 
  10.57.209.10          00-50-56-8d-91-fe     dynamic 
  10.57.209.175         00-50-56-b5-44-16     dynamic 
  10.57.209.255         ff-ff-ff-ff-ff-ff     static  
  224.0.0.22            01-00-5e-00-00-16     static  
  224.0.0.252           01-00-5e-00-00-fc     static  
  230.0.0.1             01-00-5e-00-00-01     static  
  239.255.255.250       01-00-5e-7f-ff-fa     static  

所以基本上我会在创建的输出中记录我正在执行的命令。


根据@barlop 在评论中提供的可能的解决方案,我继续执行了两个命令:

使用 ECHO

echo netstat -obna >C:\temp\netstat_with_programs.txt && netstat -obna >>C:\temp\netstat_with_programs.txt

...这在输出文件中产生了以下第一行,这并不完全满足要求:

netstat -obna  
....

使用 %aaa% 变量

set aaa=netstat -obna
echo (%aaa%>C:\temp\netstat_with_programs.txt) && (echo %aaa%|cmd)>>C:\temp\netstat_with_programs.txt

...这会产生相同的输出,但并不完全满足要求:

netstat -obna  
...

答案1

这是不可能的,因为接受命令并执行的 shell 不知道传递给命令的参数有什么作用。

例如在我们的理论rot13write C:\foobar.txtP:\sbbone.gkg

rot13write -qevir "P" -svyr "sbbone" rkg ".gkg"

这可能会告诉rot13write写入驱动器P、文件foobar和扩展名txt。或者这可能是一个玩笑,并且该路径可以已经被硬编码到可执行文件中。您不知道,shell 也不知道。

因此 shell 可以不是回显程序正在神秘写入的文件,因为 shell 对此了解不够;并且,知道如何调用它的程序没有义务对该数据执行任何操作(例如将调用命令打印到它要输出到的文件中)。您可以做的是

  1. 让 shell 回显所有命令。大多数 shell 都支持此功能。
  2. 让您执行的程序写入标准输出(通常如此),该程序将从生成它的 shell 继承(这就是您调用的程序和 shell 如何写入同一个地方 - 伪终端)
  3. 将 shell 标准输出重定向到目标文件。

这将满足您的所有需求除了显示命令中的标志和输出位置。

这看起来像这样命令提示符(我认为)

cmd /c "netstat" > myOutput.txt | type myOutput.txt

在 PowerShell 中它看起来像这样,

powershell -command "Set-PSDebug -Trace 1; netstat" | tee myOutput.txt

答案2

如果问题是使用命令显示(或重定向到文件)重定向符号(>ECHO,那么您只需对其进行转义。在这种情况下,转义符号将是^

ECHO netstat -obna ^>C:\temp\netstat_with_programs.txt >C:\temp\netstat_with_programs.txt
netstat -obna >>C:\temp\netstat_with_programs.txt

上述代码片段中的第二条命令使用>>而不是>因为您想将输出添加到同一个文件而不是覆盖它。

相关内容