問題

問題

我查看了各種提示(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 對此還不夠了解;並且,知道如何呼叫它的程式沒有義務對該資料執行任何操作(例如將呼叫命令列印到其輸出到的檔案)。你能做的是

  1. 讓 shell 回顯所有指令。大多數 shell 都支援這一點。
  2. 讓您執行的程式寫入標準輸出(通常如此),該程式將從生成它的 shell 繼承該輸出(這就是您呼叫的程式和 shell 寫入相同位置的方式 - psuedo 終端)
  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

上面程式碼片段中的第二個命令使用>>而不是>因為您想要將輸出新增到相同檔案而不是覆蓋它。

相關內容