איך להטמיע write-host בתוך סקריפט Power Shell

CHATS GHOST

New member
איך להטמיע write-host בתוך סקריפט Power Shell

שלום לכם, אני חדש בעניין הסקריפטים (בערך חודש וחצי) ואני חורש עם Power Shell ברמות מאוד גבוהות, בכל הזדמנות שיש לי אני רואה CBT, you tube קורא ספרים מאמרים ומה לא.
עכשיו אני כותב את הסקריפט הרביעי שלי, ונתקלתי בבעיה, לאחר המון חפירות ברשת ובקשות עזרה בהמון פורומים הגעתי "לעמק השווה", מצאתי עזרה ממישהו שהבין מה אני מנסה לעשות ועזר לי עם זה (כמעט בצורה מושלמת).
מה הסקריפט אמור לעשות? יש לי 3 שרתים, אני צריך לבצע להם בדיקת Test-connection ובדיקת "פורט פתוח" דרך test-netconnection
ובמידה ויש שרת שהוא למטה ו\או אי אפשר להגיע אליו, אני רוצה לקבל הודעה בסגנון can't reach the pc, הינה הסקריפט:

$computers = "localhost"

foreach ($pc in $computers) {

$test_connection = Test-Connection -Computer $pc -Count 2 -EA SilentlyContinue
$test_netconnection = Test-NetConnection $pc -Port 1433
if ($test_connection) {
$test_connection | ForEach-Object {
[PSCustomObject]@{
LocalPC = $env:COMPUTERNAME
'Tested-Server' = $pc
Online = $true
Bytes = $_.buffersize
Time = $_.ResponseTime
RemotePort = $test_netconnection.RemotePort
'ping?' = $test_netconnection.TcpTestSucceeded
}
}|ft

} else {

" write-host "can't reach server $pc
[PSCustomObject]@{
LocalPC = $env:COMPUTERNAME
'Tested-Server' = $pc
Online = $false
Bytes = $_.buffersize
Time = $_.ResponseTime
RemotePort = $test_netconnection.RemotePort
'ping?' = $test_netconnection.TcpTestSucceeded

} |ft


}
}
תודה על העזרה.
 

F00D Is G00D

New member
לדעתי עם הטכנולוגיה הזו צריך לשנות טיפה כיוון חשיבה

מה שיפה בפואר-של זה שהוא פשוט "עובד". גם אם לא עושים את הדברים נכון. ומה שיש לך פה זה קוד שמנסה לעשות את זה מאוד נכון, כמעט אפילו כמו שפת תיכנות - אבל בגללו אתה מתעכב הרבה על בעיות קטנות במקום לקבל תוצאות ומהר (שזה הכוח של פואר-של).

אם אני לוקח את המטרה שלך, השורה הבאה פשוט תיתן לך את כל השרתים שיש יש להם בעיה בפינג או בפורט הספציפי (השתמשתי ב 443 ושמות אתרים רק כדי שיהיה לי קל לבדוק)

"duckduckgo.com","google.com","bing.com" | ? {-not (Test-Connection -Count 1 -ComputerName $_ -ErrorAction SilentlyContinue) -or -not(Test-NetConnection -Port 443 -WarningAction SilentlyContinue -ComputerName $_)}
אני מבין שמה שאתה רוצה זה ללמוד. ומה שעשיתי פה כביכול לא מלמד כלום. אבל זה פחות או יותר מייצג מה שאני חושב על כל הקורסים האלו. הם מלמדים דברים מאוד מאוד רלוונטים למאחורי הקלעים. שמתאימים אולי לאנשים שבונים מודולים - אבל ממש לא רולוונטים למשימות היום יום.
כמעט בכל קורס ישר ילמדו אותך איך להשתמש ב get-member ומה ההבדל בין האש טיבל למערך וכ'ו וכ'ו... אני כבר ארבע שנים עובד עם הטכנולוגיה הזו על בסיס יום יומי. כמות הפעמים שבאמת הייתי צריך את get-member אני ייכול לספור על יד אחת (האמת גם ב [PSCustomObject]@ אף פעם לא השתמשתי).

מה אני כן ממליץ לעשות? הכלי היחיד שאני עובד איתו זה ה cheatsheet הזה:
https://ramblingcookiemonster.github.io/images/Cheat-Sheets/powershell-basic-cheat-sheet2.pdf
הוא תלוי מולי וכמעט פעם בשבוע יוצא שאני מסתכל עליו. הפקודה בתחתית נותנת לך את התחביר הבסיסי ביותר - וזה בערך התחביר שהשתמשתי איתו בדוגמא למעלה.
מעבר לזה- לנסות ולקרוא קוד של אחרים ייכול לעזור המון. אבל חשוב לדעת שהם גם לא תמיד צודקים - למשל גם את הקוד שלי. אם היו שם יותר מנגיד 100 שרתים. הייתי שוקל לפצל את הפקודה ל Jobs ככה שהם ירוצו במקביל..
מאוד ממליץ בכלל לא להשתמש בקוד מוכן as-is של אחרים. רק פונקציות ופקודות - אין טעם לנסות לקסטם קוד, פשוט כי נתקעים עם המון "זבל" שאולי רלוונטי למה שהבן אדם השני ניסה לעשות. אבל לא רלוונטי לך.
 

CHATS GHOST

New member
קודם כל תודה

זה שהשפה הזאת עובדת, זה נכון אבל ברגע שאתה רוצה לכתוב סקריפטים יותר מורכבים חייבים לעבוד עם זה כמו שצריך.

בתכלס כתבתי את הסקריפט הזה כבר והוא עובד הבעיה היא שביקשתי עזרה במשהו ומישהו אחר באחד הפורומים אמר לי "למה אתה כותב כל כך הרבה קוד? אפשר לקצר את זה" וקיצץ לי כמעט את רוב הקוד אז החלטתי לקחת את מה שהוא עשה ולעשות את זה בדרך שלו ועל הדרך גם להתנסות וללמוד קצת, להריץ פקודות זה מגניב ובהחלט אני מודה שזה עובד כמעט בכל צורה, אבל הכוונה שלי היתה כמו שאמרת ללמוד ולהתמקצע וזה מה שאני עושה.

בסופו של דבר הינה מה שיצא לי:
וזה עושה בדיוק את מה שאני צריך, בודק את השרתים שאני צריך ומציג הודעת שגיאה אם אחד השרתים לא און ליין.

קוד:
foreach ($pc in $computers) {

$test_connection = Test-Connection -Computer $pc -Count 2 -EA SilentlyContinue

$test_netconnection = Test-NetConnection $pc -Port 1433

if ($test_connection) {
   
    $test_connection | ForEach-Object {

        [PSCustomObject]@{
            LocalPC          = $env:COMPUTERNAME
            'Tested-Server'  = $pc
            Online           = $true
            Bytes            = $_.buffersize
            Time             = $_.ResponseTime
            RemotePort       = $test_netconnection.RemotePort
            'ping?'          = $test_netconnection.TcpTestSucceeded
                        
                        }#end of Custom Object in IF
                                       
                                       }|ft #end of Foreach-object

                        }#end of IF 

else {
    
    [PSCustomObject]@{
        LocalPC          = $env:COMPUTERNAME
        'Tested-Server'  = $pc
        Online           = $false
        Bytes            = $_.buffersize
        Time             = $_.ResponseTime
        RemotePort       = $test_netconnection.RemotePort
        'ping?'          = $test_netconnection.TcpTestSucceeded
        
                      } |ft #end of Custom object in Else


            #error action                      
             Write-host -BackgroundColor Red -ForegroundColor Yellow "cant reach $pc"
    
    
    }#end of Else

                         }# end of foreach loop

אגב, לגבי הקורסים אתה צודק במליון אחוז, זה באמת מה שהם מלמדים

תודה על העזרה.

אגב היא הקוד המקורי שלי:
קוד:
write-host -BackgroundColor Yellow -ForegroundColor Black " Starting first test of two - ¿?Ping Test¿?"
write-host "`n"

foreach ($pc in $computers) {
        
        
        write-host -BackgroundColor White -ForegroundColor Blue "Performing a ping test to ->$pc<-"

        Test-Connection -computername $pc -Count 3 |Select-Object PSComputerNAme,@{l='ATES-Servers';e={$_.Address}},BufferSize|Format-Table -AutoSize
                           

                            }

        Write-Host -BackgroundColor Gray -ForegroundColor Cyan "Starting Second Test of Two - ¿?TelNet Test¿?"
        write-host "`n"

foreach ($pc in $computers) {

        write-host -BackgroundColor Blue -ForegroundColor White "Performing a Telnet test to ->$pc<-"

        Test-NetConnection -Port 1433 $pc -ErrorAction Stop |
        Select-Object @{l='My Local IP Adress';e={$_.SourceAddress}},@{l='Remote AteS Server Name';e={$_.ComputerName}},RemoteAddress,RemotePort,TcpTestSucceeded|
        Format-Table -AutoSize

                            }

pause

והוא עושה את העבודה כמו שאני רוצה :)
 


 
למעלה