חוקי הפורום

עזרה בהורדה ב PowerShell



  • אני מוריד קבצים דרך PS ואני רוצה לדעת מה אורך הקובץ Content-Length: לפני שאני מבצע שמירה,
    או אחרי השמירה, מכיוון שאני רוצה לצאת מהלולאה מיד כשזה מגיע לקבצים ללא תוכן.

    זה הפקודה שאני מריץ

    Invoke-WebRequest $url -OutFile "$saveFolder\$book\$book $page.webp"
    


  • @yits

    $page = Invoke-WebRequest $url -OutFile "$saveFolder\$book\$book $page.webp" -passThru
    

    עכשיו המשתנה $page מכיל את התשובה, ובשדה RawContentLength יש לך האורך.



  • @yossiz חסך בתשובה שלו, אני מרחיב אותה לתשובה מלאה

    $page = Invoke-WebRequest $url 
    if ($page.RawContentLength  -ne 0)
    {
        Out-File -FilePath "$saveFolder\$book\$book $page.webp" -InputObject $page.RawContent 
    }
    

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



  • @dovid למדתי היום משהו מצמרר,
    שבברירת מחדל Invoke-WebRequest עושה פרסור של הדף כולל JS 😨
    על ידי מנוע IE 😨😨
    ומציג תיבת דו-שיח גרפי כאשר יש שגיאת JS 😨😨😨

    נסה Invoke-WebRequest https://www.google.com בנטפרי

    ecf3dcfa-361f-44c7-8ab7-c05f327e4172-image.png



  • @yossiz
    זה עובד מצוין אבל הוא שומר קודם את הקובץ הריק למחשב.
    מה ש @dovid כתב זה יותר ארוך אבל לא שומר בכלל קבצים ריקים.

    תודה רבה.



  • @yossiz אמר בעזרה בהורדה ב PowerShell:

    נסה Invoke-WebRequest https://www.google.com בנטפרי

    לא מופיע לי שגיאה.

    PS C:\Users\XXXXX> Invoke-WebRequest https://www.google.com
    
    
    StatusCode        : 200
    StatusDescription : OK
    Content           : <!doctype html><html dir="rtl" itemscope="" itemtype="http://schema.org/WebPage"
                        lang="iw"><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta
                        content="/images/branding/goog...
    RawContent        : HTTP/1.1 200 OK
                        X-XSS-Protection: 0
                        X-Frame-Options: SAMEORIGIN
                        Cache-Control: private, max-age=0
                        Content-Type: text/html; charset=UTF-8
                        Date: Tue, 26 May 2020 12:16:31 GMT
                        Expires: -1
                        P3P: CP=...
    Forms             : {f}
    Headers           : {[X-XSS-Protection, 0], [X-Frame-Options, SAMEORIGIN], [Cache-Control, private, max-age=0],
                        [Content-Type, text/html; charset=UTF-8]...}
    Images            : {@{innerHTML=; innerText=; outerHTML=<IMG id=hplogo style="PADDING-BOTTOM: 14px; PADDING-TOP:
                        28px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px" alt=Google
                        src="/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png" width=272
                        height=92>; outerText=; tagName=IMG; id=hplogo; style=PADDING-BOTTOM: 14px; PADDING-TOP: 28px;
                        PADDING-LEFT: 0px; PADDING-RIGHT: 0px; alt=Google;
                        src=/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png; width=272;
                        height=92}, @{innerHTML=; innerText=; outerHTML=<IMG id=tsuid1 style="CURSOR: pointer; POSITION:
                        absolute; LEFT: 5px; Z-INDEX: 300; TOP: 4px" alt="" src="/textinputassistant/tia.png" width=27
                        height=23 data-script-url="/textinputassistant/11/iw_tia.js">; outerText=; tagName=IMG; id=tsuid1;
                        style=CURSOR: pointer; POSITION: absolute; LEFT: 5px; Z-INDEX: 300; TOP: 4px; alt=;
                        src=/textinputassistant/tia.png; width=27; height=23;
                        data-script-url=/textinputassistant/11/iw_tia.js}}
    InputFields       : {@{innerHTML=; innerText=; outerHTML=<INPUT type=hidden value=iw name=hl>; outerText=;
                        tagName=INPUT; type=hidden; value=iw; name=hl}, @{innerHTML=; innerText=; outerHTML=<INPUT
                        type=hidden value=hp name=source>; outerText=; tagName=INPUT; type=hidden; value=hp; name=source},
                        @{innerHTML=; innerText=; outerHTML=<INPUT type=hidden name=biw>; outerText=; tagName=INPUT;
                        type=hidden; name=biw}, @{innerHTML=; innerText=; outerHTML=<INPUT type=hidden name=bih>;
                        outerText=; tagName=INPUT; type=hidden; name=bih}...}
    Links             : {@{innerHTML=<SPAN class=gbtb2></SPAN><SPAN class=gbts>חיפוש</SPAN>; innerText=חיפוש; outerHTML=<A
                        onclick=gbar.logger.il(1,{t:1}); id=gb_1 class="gbzt gbz0l gbp1"
                        href="https://www.google.co.il/webhp?tab=ww"><SPAN class=gbtb2></SPAN><SPAN
                        class=gbts>חיפוש</SPAN></A>; outerText=חיפוש; tagName=A; onclick=gbar.logger.il(1,{t:1});;
                        id=gb_1; class=gbzt gbz0l gbp1; href=https://www.google.co.il/webhp?tab=ww}, @{innerHTML=<SPAN
                        class=gbtb2></SPAN><SPAN class=gbts>חיפוש תמונות</SPAN>; innerText=חיפוש תמונות; outerHTML=<A
                        onclick=gbar.logger.il(1,{t:2}); id=gb_2 class=gbzt
                        href="https://www.google.co.il/imghp?hl=iw&amp;tab=wi"><SPAN class=gbtb2></SPAN><SPAN
                        class=gbts>חיפוש תמונות</SPAN></A>; outerText=חיפוש תמונות; tagName=A;
                        onclick=gbar.logger.il(1,{t:2});; id=gb_2; class=gbzt;
                        href=https://www.google.co.il/imghp?hl=iw&amp;tab=wi}, @{innerHTML=<SPAN class=gbtb2></SPAN><SPAN
                        class=gbts>מפות</SPAN>; innerText=מפות; outerHTML=<A onclick=gbar.logger.il(1,{t:8}); id=gb_8
                        class=gbzt href="https://maps.google.co.il/maps?hl=iw&amp;tab=wl"><SPAN class=gbtb2></SPAN><SPAN
                        class=gbts>מפות</SPAN></A>; outerText=מפות; tagName=A; onclick=gbar.logger.il(1,{t:8});; id=gb_8;
                        class=gbzt; href=https://maps.google.co.il/maps?hl=iw&amp;tab=wl}, @{innerHTML=<SPAN
                        class=gbtb2></SPAN><SPAN class=gbts>YouTube</SPAN>; innerText=YouTube; outerHTML=<A
                        onclick=gbar.logger.il(1,{t:36}); id=gb_36 class=gbzt
                        href="https://www.youtube.com/?gl=IL&amp;tab=w1"><SPAN class=gbtb2></SPAN><SPAN
                        class=gbts>YouTube</SPAN></A>; outerText=YouTube; tagName=A; onclick=gbar.logger.il(1,{t:36});;
                        id=gb_36; class=gbzt; href=https://www.youtube.com/?gl=IL&amp;tab=w1}...}
    ParsedHtml        : mshtml.HTMLDocumentClass
    RawContentLength  : 48899
    
    
    


  • במיקום של השמירה אני משתמש בכמה משתנים וניסיתי לעשות עם פס תחתון והוא זיהה רק את המשתנה השני, ולכן השתמשתי עם רווח.

    -OutFile "$saveFolder\$book\$book_$page.webp"
    

    איך אפשר להשתמש בשניהם יחד?

    .

    אגב המשתנה page הוא מספר רץ אצלי, ואם אני ישתמש איתו גם למה שכתבת כנראה זה לא יעבוד.

    $page = Invoke-WebRequest $url -OutFile "$saveFolder\$book\$book $page.webp" -passThru
    
    


  • @yossiz זה מאפיין בפני עצמו ParsedHtml, לא ככה?



  • @yits אמר בעזרה בהורדה ב PowerShell:

    אגב המשתנה page הוא מספר רץ אצלי, ואם אני ישתמש איתו גם למה שכתבת כנראה זה לא יעבוד.

    נכון, לא שמתי לב שאתה כבר משתמש במשתנה בשם ‎$page. תן לו שם אחר.

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

    -OutFile "$saveFolder$book$book_$page.webp"

    איך אפשר להשתמש בשניהם יחד?

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

    -OutFile "$saveFolder\$book\$($book)_$page.webp"
    -OutFile ("$saveFolder\$book\$book" + "_$page.webp")
    


  • @dovid אמר בעזרה בהורדה ב PowerShell:

    @yossiz זה מאפיין בפני עצמו ParsedHtml, לא ככה?

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



  • @dovid
    הפתרון שהבאת לא עובד,
    הוא יודע לומר אם הגודל הוא 0 או לא,
    אבל לא ניתן לייצא אותו אח"כ לקובץ.

    זה מה שניסיתי

    $saveFolder = ($pwd).path
    $book = 602285
    $page = 0
    md 602285
    $url = "http://mefo.otzar.org/api/books/$book/$page/image"
    $Responsepage = Invoke-WebRequest $url 
    if ($Responsepage.RawContentLength  -ne 0)
    	{Out-File -FilePath "$saveFolder\$book\$book $page.webp" -InputObject $Responsepage.RawContent}
    else 
    	{break }
    


  • @yits "אבל לא ניתן לייצא אותו אח"כ לקובץ"
    קורה משהו? מנין לך שהבדיקה עובדת?
    אגב אני כעת רואה שRawContentLength מחזיר את הגודל של התוכן + הכותרות וממילא זה לא הכי מתאים.
    כמו"כ הRawContent מכיל כותרות יש לשנות אותו לContet.
    כל זה בלי קשר לבעיה שאתה אומר שזה לא עובד..



  • @dovid אמר בעזרה בהורדה ב PowerShell:

    אני עושה את זה בתוך לולאה, ואם הקובץ ריק הוא יוצא מהלולאה,
    אבל במקרה שיש תוכן אני לא מצליח לשמור את הנתונים.

    גם עם Content זה לא עובד.



  • @yits אמר בעזרה בהורדה ב PowerShell:

    אבל במקרה שיש תוכן אני לא מצליח לשמור את הנתונים.

    אבל אתה לא מתאר איך ה"לא מצליח" הזה מתממש? יש שגיאה? הקובץ נוצר ריק? הקובץ לא נוצר?



  • @yossiz אמר בעזרה בהורדה ב PowerShell:

    @yits אמר בעזרה בהורדה ב PowerShell:

    אבל במקרה שיש תוכן אני לא מצליח לשמור את הנתונים.

    אבל אתה לא מתאר איך ה"לא מצליח" הזה מתממש? יש שגיאה? הקובץ נוצר ריק? הקובץ לא נוצר?

    נוצר קובץ לא תקין.



  • @yits סוף סוף אתה כותב משהו, לא מתאים לאיש עם ידע טכני כמוך להגיד "לא עובד" כזה סתמי!
    תשנה את ה$Responsepage.RawContent ל$Responsepage.Content.



  • @yits אמר בעזרה בהורדה ב PowerShell:

    גם עם Content זה לא עובד.

    סליחה, החמצתי.
    אם ככה אני לא יודע.



  • הממ.. זה בעייתי...
    https://stackoverflow.com/questions/24708859



  • @yits זה נראה קצת בעייתי להעביר את המידע של Invoke-WebRequest אם זה מידע בינארי כי זה מומר ל-string,
    נראה לי שהכי קל להשתמש בקוד שלי ולכתוב תנאי אחרי ההורדה שאם ה-contentLength הוא 0 למחוק את הקובץ ולהפסיק את הלולאה.
    משהו כזה:

    $ResponsePage = Invoke-WebRequest $url -OutFile "$saveFolder\$book\$book $page.webp" -passThru
    if ($Responsepage.RawContentLength  -eq 0) {
        rm "$saveFolder\$book\$book $page.webp"
        break
    }
    


  • מה זה הסיפור הזה שלח תשובה ריקה? זה לא הכי נורמלי.
    זה מחזיר OK כלומר 200? יש מצב לכתובת דוגמה כזו?

    כשהכרתי את PowerShell אז התלהבתי שאוכל לעשות בקלות קודים לפעולות קטנות במחשב כיוצא באלו,
    אבל איבדתי את ההתלהבות ברגע שגיליתי את LinqPad שמאפשר להריץ בקלות C#.
    השפה והשימוש בסקריפטים של powershell או בש (וק"ו batch) ממש קשים לי.



  • @dovid אמר בעזרה בהורדה ב PowerShell:

    מה זה הסיפור הזה שלח תשובה ריקה? זה לא הכי נורמלי.
    זה מחזיר OK כלומר 200? יש מצב לכתובת דוגמה כזו?

    (אני עונה במקום @yits כי אני יודע באיזה אתר מדובר)
    כן, זה מחזיר 200... זה באמת לא הכי נורמלי, אבל מה לעשות... ¯/_(ツ)_\¯



  • @yossiz @yossiz
    עובד לי מצוין (עם הפתרון של @yossiz).


התחבר כדי לפרסם תגובה
 

בא תתחבר לדף היומי!