DCSIMG
October 2007 - Posts - שחר.נט

שחר.נט

בלוגים שאני קורא

ספרים מומלצים

October 2007 - Posts

XXX.parse() - ההיגיון שמאוחרי המתודה

אני מניח שמדי פעם יוצא לאנשים להשתמש במתודה int.parse, short.parse וכו'. היום, נתקלתי שוב בזה שהמתודות הללו מקבלות string וממירות אותו ל Type המבוקש. מה הבעייה? הן מקבלות רק string. לעומת זאת, Convert.Int16, וכל המתודות תחת Convert מקבלות מספר types שונים. יש למישהו הסבר למה?

שבוע טוב.

Code Snippets ל C#

למי שלא מכיר, בשביל לפצות על העובדה שלתוך הסביבה שלנו, מתכנתי C#, לא הוכנסה ערימה של Code snippets בדומה לזאת שהוכנסה למתכנתי VB.NET, ניתן להוריד מכאן כמות מכובדת של snippets בנושאים שונים.

3 טיפים ל Windows PowerShell

  1. כדי לקבל את רשימת כל המשתנים המוגדרים כעת במערכת, בין אם משתנים שמגיעים built in ובין אם משתנים שאתתם הגדרתם, יש להשתמש ב gv (שהוא, למעשה, alias של Get-Variable)
  2. אם אתם מנסים ליצור משתנה סביבה חדש באמצעות הפקודה new-item קחו בחשבון שה property ששמו path מייצג למעשה את השם של המשתנה ו value, מייצג, כמובן את הערך.
  3. בשביל ליצור "זרימה צדדית" של האובייקטים ב PowerShell השתמשו ב Tee-Object.

 

get-process notepad* | tee-object -variable results | stop-process

הדוגמא הזאת, למשל, מדגימה תפסיק את הפרוססים ששמם מתחיל ב notepad, אבל גם תשמור מערך System.Diagnostics.Process עם הפרוססים שהופסקו לתוך המשתנה results.

 

במקרה של התקנת Visual Studio שנכשלת מסיבות לא ברורות....

במקרה של התקנת Visual Studio שנכשלה מסיבות לא ברורות, תבדקו, אם במקרה אחת מהתיקיות בנתיב של התיקייה עם קבצי ההתקנה היא בעברית. במידה שכן, וקרה לכם מה שקרה לי, תקבלו הודעות שגיאה מוזרות על קבצים שלא נמצאו (למרות שאם תחפשו אותם תראו שהם קיימים), קבצים שאין לתוכנית התקנה הרשאות לגשת אליהם וכו'.

במקרה כזה, וודא שכל הנתיב מורכב מתיקיות באנגלית.

trap statement


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

בתגובה, היו ששאלו אותי איך ניתן לעבוד ולנהל שגיאות בצתורה דומה לדוט.נט שם אנחנו עובדים אם try...catch statement.

התשובה, היא trap statement:

image
למעשה, trap הוא החלופה של catch. אין לנו ממש משפט try מובהק ב powershell, מאחר שמדובר בסקריפטינג.
לכן, נהוג לשים את ה trap תחילת הפונקציה. ב ExceptionType, מציינים את סוג ה Exception כשאפשר, כמובן, מספר משפטי trap, כל אחד לסוג אחר.
אם נשתמש בתוך ה trap ב ._$ זה יפנה אותנו, למעשה, לאובייקט ErrorRecord שכולל את פירוט השגיאה.
בתוך ה trap, ניתן להשתמש בביטוי continue שאומר שההרצה תחזור לשורת הקוד שלאחר השורה שזרקה את ה exception. אם נשתמש ב break, זה יפסיק את הרצת הסקריפט. ניתן גם להשתמש ב return שמחזיר ערך מחוץ ל scope של ה trap.
השיטה הזאת, בהרבה מובנים נוחה יותר מעובדה ישירה כל שורה מול אובייקט ה error, כדי לבדוק אם אירעה שגיאה. פה, אנחנו נוכל לוודא שנדע על זה בנוחות, כולל מיון לסוג ה Exception.
 
בהצלחה.
 

לעבוד בנוחות עם Windows PowerShell ב Notepad++

בתור אחד שכותב את רוב הסקריפטים שלו ב notepad++, הרגשתי צורך באיזשהו כלי, שיאפשר לצבוע אתimage מילות המפתח, את ה cmdlets השונים וכו' ולמעשה, יהפוך את הפיתוח ב notepad++ של powershell להרבה יותר נוח.
לכן, השתמשתי במנגנון ה user defined language של notepad++, שהוא מאד נוח, כדי ליצור קובץ עם הגדרות הסינטקס של powershell. את הקובץ אתם יכולים להוריד מכאן.

בתוך הקובץ יש קובץ readme עם הוראות באנגלית, אבל הנה גם הוראות בעברית:

  1. פרסו את קובץ הZIP (את תוכנו) ל:

%AppData%\Notepad++

למען האמת, זה הכל. במידה ואתם מתבקשים לדרוס קובץ קיים, תאשרו, כל עוד לא יצרתם בעבר user defined language משלכם. אם יצרתם, תצטרכו לאחד בין קבצי הXML.

השלב האחרון, הוא בתפריט ה Languages ב notepad++ לבחור Windows PowerShell בתור השפה, ועכשיו ניתן לעבוד בנוחות.

*

להורדת Notepad++.

בהצלחה.

מאיפה האפליקציה שלי ב PowerShell רצה?

לעיתים, אנחנו רוצים לדעת מאיפה ה cmdlets שלנו שמורץ במסגרת ה powershell רץ. כלומר, איפה, בדיוק, נמצא ה powershell ברגע זה, כדי שנוכל לבצע פעולה שקשורה לזה.
מי שניסה, נניח, להשתמש ב System.IO.Directory.GetCurrentDirectory היה מגלה שהוא נתונים לא נכונים במקרה הטוב ו Exception במקרה הקצת פחות טוב (או אולי, בעצם היותר טוב - כי הוא לא עובד עם נתונים שגויים).

הפיתרו ( אפשרי רק אם יורשים מ PSCmdlet) הוא להשתמש ב:

 
image .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

begin...process...end statement

נתקלתי בשאלה של אנשים שהתנסו בכתיבת cmdlets ורוצים לכתוב סקריפטים. כשהם כתבו cmdlets הם התרגלו שאחרי שהם יורשים מ Cmdlet או מ PSCmdlet, הם עושים override למספר מתודות - BeginProcessing שמתבצעת פעם אחת עם הקריאה, ProcessRecord שמתבצעת מספר פעמים, בהתאם לערכים שהועברו ב Pipeline (עבור כל ערך, תתבצע הפעולה) ו- EndProcessing.

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

הסתכלו, למשל, על הקוד הבא:

image

בקוד הזה, באמת, יש הפרדה בין BEGIN, PROCESS ו- END. בתוך כל אחד מהבלוקים האלה ניתן לשים את הקוד. אם אתה רוצים להתייחס בתוכם לערך שהועבר מה pipeline (הערך הנוכחי) זה מתבצע עם הסימן _$ (דולר ואנדרסקור).

בהצלחה.

נ.ב. איך אפשר לתרגם לעברית statement בלי להישמע מגוחך יותר מדי?

קוד מריץ קוד

כל מי שמכיר את vbScript, ושפות סקריפטינג אחרות, יודע את אחד מהיתרונות מבחינת נוחות (למרות שלפעמים טיפה חיסרון מבחינת ארכיטקטורה) - קוד שמריץ את עצמו. בVbScript זה נקרא Execute. ב PowerShell זה נקרא invoke-expression

ה cmdlet הזה, Invoke-Expression מקבל ביטוי, או משתנה שמכיל ביטוי ומבצע אותו. פשוט מאד.

ה Zune החדש

ExecutionPolicy ב Windows PowerShell

ב PS, יש מושג בשם Execution Policy, מדיניות ההרצה של סקריפטים. החלוקה היא למספר רמות. התבקשתי לכתוב את ההבדלים בין הרמות השונות, ומה הייחוד של כל אחד. בשביל לראות באיזה רמה אתם מוגדרים, יש לכתוב get-ExecutionPolicy כדי להגדיר רמה יש להקליד set-executionpolicy ואת שם הרמה.

Restricted (ברירת מחדל)
מאפשר הרצת פקודות יחידות, לא מאפשר הרצת סקריפטים כלל.

AllSigned
סקריפטים יכוליםל רוץ רק בתנאי שהם חתומים דיגיטלית ע"י מפיץ מורשה (trusted publisher), מתקבלת התראה לפני הרצת סקריפט.

RemoteSigned
סקריפטים שרצים באופן לוקאלי מהמחשב, ונוצרו בו, יכולים לרוץ ללא חתימה דיגיטלית. חתימה דיגילטית נדרשת רק לסקריפטים שהורדו מהאינטרנט  למחשב.
לא מוצגת התראה לפני הרצת סקריפט מ trusted publisher.

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

פשוט וקל.