我現在有一個非常簡單的腳本,坪10個IP地址:與啓動子循環改善批處理文件
@ECHO OFF
for /L %%i in (100, 1, 110) DO (
START /W /B cmd /c ping -n 1 192.168.0.%%i | find "time="
)
如預期的輸出:
C:\Users\herpderp>test.bat Reply from 192.168.0.101: bytes=32 time=294ms TTL=64 Reply from 192.168.0.104: bytes=32 time=1ms TTL=64
然而,這是非常緩慢而且絕對會發生。當我運行這個用PowerShell的Measure-Command
我得到這些結果:
PS C:\Users\derpherp> measure-command {start-process test.bat -Wait} Days : 0 Hours : 0 Minutes : 0 Seconds : 23 Milliseconds : 107 Ticks : 231074173 TotalDays : 0.000267446959490741 TotalHours : 0.00641872702777778 TotalMinutes : 0.385123621666667 TotalSeconds : 23.1074173 TotalMilliseconds : 23107.4173
所以我們看到它正在〜23日秒鐘的執行。現在
,如果我是一個Linux系統上,想要做同樣的事情,我可以做到以下幾點:
#!/bin/bash
for ip in $(seq 100 110); do
ping -c 1 192.168.0.$ip | grep "bytes from" | cut -d" " -f4 | cut -d ":" -f1 &
done
結果是多種方式不同:
結果並不總是順序的,這意味着它實際上更異步地啓動命令:
[email protected]:~/vids/bash_scripting# ./test.sh 192.168.0.104 192.168.0.100 192.168.0.103 192.168.0.101
它顯示所有積極結果的時間通常小於一秒,這可以擴展到更大的數字集。
所以,我的問題是,這是批量腳本的限制嗎?我發現很難相信bash比Windows CMD解釋器在執行這樣一個簡單任務時的字面好幾百倍?
如果這是有限的,PowerShell是否提供了一種有競爭力的方式來創建任務?我用Start-Job
在foreach循環,但似乎變得不可行了大量的任務(即A/16網絡上Test-Connection
)
編輯1
@ECHO OFF
for /L %%i in (100, 1, 110) DO (
ping -n 1 192.168.0.%%i | find "time="
)
它輸出當前窗口只要初始變體
@ECHO OFF
for /L %%i in (100, 1, 110) DO (
START ping -n 1 192.168.0.%%i | find "time="
)
這將輸出到每個IP的唯一窗口,並且只需要很長時間就可以完成。
[?.NET DNS類PowerShell後臺作業可能(的可能的複製http://stackoverflow.com/questions/36205922/net-dns -class-powershell-background-job-possible)和[並行作業和隊列系統](http://stackoverflow.com/questions/24471209/how-to-implement-a-parallel-jobs-and-queues-system)和[並行運行命令](http://stackoverflow.com/questions/4016451/can-powershell-run-commands-in-parallel)和[多線程PowerShell ping腳本](http://stackoverflow.com/questions/ 37954004/how-to-multithread-powershell-ping-script) – TessellatingHeckler
[ping IP地址範圍](http://stackoverflow.com/questions/34378793/ping-range-of-ip-adresses) - [ping併發] (http://stackoverflow.com/ques tions/24930714/pinging-an-array-of-ip-addresses-concurrently-in-powershell) - [同時運行多個腳本塊](http://stackoverflow.com/questions/9601118/running-multiple-scriptblocks - 在同一時間與開始工作,而不是循環)相關的http://ramblingcookiemonster.github.io/Invoke-Ping/和[快速ping多臺機器](http:// codereview.stackexchange。com/questions/97726/powershell-to-quickly-ping-a-number-of-machines) – TessellatingHeckler
bash在你的場景中勝過CMD的原因是因爲你的bash腳本在後臺運行進程,所以他們沒有運行順序但平行。 CMD並不真的支持這一點。要在CMD中做類似的事情,你必須在新的CMD實例中啓動每個「ping」,這不允許你在一個窗口中獲得輸出。 –