我看过各种建议(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.txt
中P:\sbbone.gkg
rot13write -qevir "P" -svyr "sbbone" rkg ".gkg"
这可能会告诉rot13write
写入驱动器P
、文件foobar
和扩展名txt
。或者这可能是一个玩笑,并且该路径可以已经被硬编码到可执行文件中。您不知道,shell 也不知道。
因此 shell 可以不是回显程序正在神秘写入的文件,因为 shell 对此了解不够;并且,知道如何调用它的程序没有义务对该数据执行任何操作(例如将调用命令打印到它要输出到的文件中)。您可以做的是
- 让 shell 回显所有命令。大多数 shell 都支持此功能。
- 让您执行的程序写入标准输出(通常如此),该程序将从生成它的 shell 继承(这就是您调用的程序和 shell 如何写入同一个地方 - 伪终端)
- 将 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
上述代码片段中的第二条命令使用>>
而不是>
因为您想将输出添加到同一个文件而不是覆盖它。