我查看了各種提示(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 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
。或者這可能只是個笑話,而那條路可以已經被硬編碼到可執行檔中。你不知道,貝殼也不知道。
所以外殼可以不是echo 到程式正在神祕地寫入的文件,因為 shell 對此還不夠了解;並且,知道如何呼叫它的程式沒有義務對該資料執行任何操作(例如將呼叫命令列印到其輸出到的檔案)。你能做的是
- 讓 shell 回顯所有指令。大多數 shell 都支援這一點。
- 讓您執行的程式寫入標準輸出(通常如此),該程式將從生成它的 shell 繼承該輸出(這就是您呼叫的程式和 shell 寫入相同位置的方式 - psuedo 終端)
- 將 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
上面程式碼片段中的第二個命令使用>>
而不是>
因為您想要將輸出新增到相同檔案而不是覆蓋它。