שאלות בכתיבת Batch

  • פותח הנושא asf
  • פורסם בתאריך

asf

משתמש פעיל
בס"ד

שלום וברכה

האם אני יכול לעשות Choice בתוך IF בקובץ CMD

לדוגמה ככה

קוד:
:manualdism
	cls
	set /p dismpath="type path to dism (without the actual dism.exe): "

:: first check	

	[COLOR="Red"]if[/COLOR] not exist "%dismpath%\dism.exe" [COLOR="black"]([/COLOR]
	cls
	color 04
	echo.
	echo ======================================
	echo !! you didn't set a valid DISM path !!
	echo ======================================
	echo.
	pause
	color 07
	cls
	echo.
	echo 1. Try again
	echo 2. go back to dism menu
	echo 3. go back to settings menu
	echo.
	[COLOR="red"]choice[/COLOR] /c 123 /n
	
	if errorlevel 3 goto :mainmenu
	if errorlevel 2 goto :dismmenu
	if errorlevel 1 [COLOR="Magenta"]([/COLOR]
	cls
	set /p dismpath="Please enter a valid path to DISM.exe (without the actual dism.exe): "[COLOR="Magenta"])[/COLOR]
	[COLOR="black"])[/COLOR]

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

The syntax of the command is incorrect.


מה הבעיה פה? אני עברתי כמה פעמים על זה ולא מצליח למצוא הבעיה.

בתודה רבה מראש
 

moishy

משתמש סופר מקצוען
מנוי פרימיום
שים לב לשני השינויים:
קוד:
@echo off
:manualdism
    cls
    set /p dismpath="type path to dism (without the actual dism.exe): "

::first check    
    
    if exist "%dismpath%\dism.exe" (
    choice /c 123 /n
    if errorlevel 3 goto :mainmenu
    if errorlevel 2 goto :dismmenu
    if errorlevel 1 (
    cls
    set /p dismpath="Please enter a valid path to DISM.exe (without the actual dism.exe): ")
    )
    
    else if not exist "%dismpath%\dism.exe" (
    cls
    color 04
    echo.
    echo ======================================
    echo !! you didn't set a valid DISM path !!
    echo ======================================
    echo.
    pause
    color 07
    cls
    echo.
    echo 1. Try again
    echo 2. go back to dism menu
    echo 3. go back to settings menu
    echo.
    )
 

asf

משתמש פעיל
אם אפשר לשאול, מה שינית ממה שאני עשיתי?
 

asf

משתמש פעיל
אני כבר לגמרי מבולבל

אני ניסיתי עכשיו את זה (זה מובנה על הרעיון שלך רק רציתי לראות אם זה עובד גם בלי הELSE) וזה עובד עכשיו

קוד:
:manualdism
	cls
	set /p dismpath="type path to dism (without the actual dism.exe): "
	if not exist "%dismpath%\dism.exe" (
	color 04
	echo.
	echo ======================================
	echo !!   That's not a valid DISM path   !!
	echo ======================================
	echo.
	pause
	color 07
	cls
	echo.
	echo 1. Try again
	echo 2. go back to dism menu
	echo 3. go back to settings menu
	echo.
	choice /c 123 /n
	
	if errorlevel 3 goto :mainmenu
	if errorlevel 2 goto :dismmenu
	if errorlevel 1 (
	cls
	set /p dismpath="Please enter a valid path to DISM.exe (without the actual dism.exe): "
	)
	)
	goto :dismmenu

אז בעצם מה זה שונה ממה שאני כתבתי בהתחלה?
 

moishy

משתמש סופר מקצוען
מנוי פרימיום
סליחה טעות שלי.
רק שים לב להתחיל את הקובץ עם
קוד:
@echo off
 

asf

משתמש פעיל
שאלה אחר

איך אני יכול להגדיר משתנה אחד מה שמוגדר למשתנה שני? בלי לעשות
קוד:
set test1=%test2%

בתודה מראש
 

moishy

משתמש סופר מקצוען
מנוי פרימיום
לא הבנתי
 

asf

משתמש פעיל
בא נגיד אני מגדיר משתנה ABCD = 1234 איך אני יכול לעשות שמשתנה XYZ מקבל משיש לABCD ז"א 1234

מקווה שעכשיו ברור
 

moishy

משתמש סופר מקצוען
מנוי פרימיום
את זה הבנתי.
לא הבנתי מה רע בset
 

asf

משתמש פעיל
נכתב ע"י moishy;1967227:
את זה הבנתי.
לא הבנתי מה רע בset

אין לי בעי' עם SET, רק אני לא רוצה לעשות set משתנה ראשון = למשתנה שני, בגלל שאני מתכוון לשנות המשתנה השני, ואני לא רוצה שהמשתנה הראשון ישתנה ביחד עם השני,

להסביר בצורה יותר ערוכה.
בה נגיד אני רוצה להגדיר נתיב לDISM, מה יקרה אם מישהו יכניס נתיב שלא קיים? נכון שאני יכול לעשות אזהרה ולנקות המשתנה, אבל מה אני עושה אם מישהו רוצה לשנות נתיב לDISM ז"א יש כבר נתיב מוגדר והוא רוצה לשים נתיב חדש, אז אם אני ינקה המשתנה בעת שאני מציג לו אזהרה אז המשתנה הראשון (הטובה) גם יתנקה, אז אם הוא מחלית שהוא לא מחילף לבסוף, הוא נשאר תקוע בגלל שנקיתי לו המשנה, אז אני חשבתי מרעיון, שאם מישהו רוצה לשנות הPATH אז הוא למעשה מגדיר משתנה שני, ורק אם זה עבר הבדיקה שזה אכן נתיב קיים לDISM זה מוגדר על המשתנה הראשון, אז אם אני מגדיר המשתנה ראשון=משתנה שני, אז בשנייה שאני מגדיר משהו על המשנה השני זה משתנה גם למשתנה ראשון, אז מה שאני מחפש זה איזשהו רעיון כמו PIPE.

מקווה שעכשיו ברור.

וסליחה על דרשת שבת שובה ;)

תודה רבה
 

asf

משתמש פעיל
מצאתי את זה ברשת בחיפוש

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

קוד:
for /f "delims=" %%a in ('ver') do @set foobar=%%a

קוד:
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (SET var=%%F)

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

moishy

משתמש סופר מקצוען
מנוי פרימיום
נכתב ע"י asf;1967779:
אין לי בעי' עם SET, רק אני לא רוצה לעשות set משתנה ראשון = למשתנה שני, בגלל שאני מתכוון לשנות המשתנה השני, ואני לא רוצה שהמשתנה הראשון ישתנה ביחד עם השני
המשתנה השני לא ישתנה באופן אוטומטי עם שינוי המשתנה הראשון, כל עוד לא תשנה אותו בעצמך.
 

asf

משתמש פעיל
נכתב ע"י moishy;1968660:
המשתנה השני לא ישתנה באופן אוטומטי עם שינוי המשתנה הראשון, כל עוד לא תשנה אותו בעצמך.

הפוך, המשתנה הראשון יתעדכן עם המשתנה השני, בגלל שהמתשנה השני מוגדר בהמשתנה להראשון.
 

moishy

משתמש סופר מקצוען
מנוי פרימיום
נכתב ע"י asf;1968822:
הפוך, המשתנה הראשון יתעדכן עם המשתנה השני, בגלל שהמתשנה השני מוגדר בהמשתנה להראשון.
באמת?!
תראה דוגמא:
קוד:
@echo off
set var1=initial value
echo var1 contains : "%var1%"
set var2=%var1%
echo var2 contains : "%var2%"
set var1=new value
echo var1 contains : "%var1%"
echo var2 contains : "%var2%"
pause
 

asf

משתמש פעיל
נכתב ע"י moishy;1968847:
באמת?!
תראה דוגמא:
קוד:
@echo off
set var1=initial value
echo var1 contains : "%var1%"
set var2=%var1%
echo var2 contains : "%var2%"
set var1=new value
echo var1 contains : "%var1%"
echo var2 contains : "%var2%"
pause

אכן צודק.

אני לא זכרתי שלמעשה CMD לא רואה המשתנה בתור משתנה רק בתור טקסט.

תודה רבה.
 

asf

משתמש פעיל
להלן כמה שאלות על הנושא של פרמטרים

להלן סיקור קטן מה שאני הבנתי שזה פרמטרים, אז ככה.
פרמטרים זה משתנים שמקביל תצורתם ע"י הפקודות שכותבים ביחד עם הרצת הסקריפט.
לדוגמה,
קוד:
@ echo off
call :test "moshe" prove " working"
pause 
:test
echo hello %~1 i just wanted to %2 that this is%~3
pause
goto :eof

moshe; prove; working הם הפקודות ששהפרמטרים לקחו והשתמשו בהם, וזה הולך לפי סדר 0 זה שם הקובץ 1 זה הפקודה הראשונה (פה זה Moshe) וכן הלאה.

עכשיו לשאלות.

1. איך אני יכול להשתמש עם יותר מ9 פרמטרים? ראיתי קצת על shift אבל לא הבנתי מילה וחצי.

2. אני רואה בהרבה קודים שמשתמשים עם אותיות, מה זה? והאם זה חילופין למספרים? ז"א שיש אפשרות להשתמש עם יותר מרק תשע פרמטרים.

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

תודה רבה מראש
 

moishy

משתמש סופר מקצוען
מנוי פרימיום
נכתב ע"י asf;1969639:
1. איך אני יכול להשתמש עם יותר מ9 פרמטרים? ראיתי קצת על shift אבל לא הבנתי מילה וחצי.
Batch יכול להתמודד בו זמנים רק עם 9 פרמטרים, אם יש יותר מ9, הפרמטרים נשמרים בזיכרון אבל אין לBatch דרך לבצע גישה אליהם. ע"מ להשתמש בהם יש להעביר אותם ל9 המקומות הזמינים. דבר זה נעשה ע"י הפקודה shift. פקודה זו מוחקת את הפרמטר הראשון מהזכרון ועי"ז הפרמטרים האחרים מתקדמים מקום אחד קדימה. מכיון שshift מזיז רק מקום אחד קדימה, אם יש יותר מ10 פרמטרים צריך לעבור בלולאה על כל הפרמטרים, כפי שתראה בדוגמא הבאה:
קוד:
@ECHO OFF
:Loop
IF "%~1"=="" GOTO Continue
    REM כאן הסקריפט מטפל ב%1
SHIFT
GOTO Loop
:Continue
בברירת מחדל, shift מוחק את הפרמטר הראשון מהזכרון כך שלאחר הרצת הפקודה %1 בעצם הוא מה ש%2 היה לפני הרצת הפקודה.
ניתן לקבוע איזה פרמטר ימחק, לדוגמא shift /4 ימחק את הפרמטר הרביעי ויקדם את הבאים אחריו במקום אחד, בזמן ש%1-%3 לא יושפעו.
שים לב, לשימוש באפשרות זו יש להגדיר SETLOCAL ENABLEEXTENSIONS.

נכתב ע"י asf;1969639:
2. אני רואה בהרבה קודים שמשתמשים עם אותיות, מה זה? והאם זה חילופין למספרים? ז"א שיש אפשרות להשתמש עם יותר מרק תשע פרמטרים.
אפשר להשתמש עם יותר מ9 פרמטרים, אבל אין גישה ליותר מ9 בו זמנית כמבואר לעיל.

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

asf

משתמש פעיל
תודה רבה על התשובה המפורטת.

שאלה אחר.

איך אני יכול להעביר משתנה כפקודה בפרמטרים?
<strike>
דוגמה: אני מגדיר ABC = XYZ ואני מריץ הBAT עם הפקודה (פרמטר) ABC, איך אני יכול לעשות שהBAT יראה את ABC לא כABC רק כXYZ

תודה רבה מראש
</strike>

טעות... זה משהו פשוט אבל לא יודע למה לפעמים הBATCH נתקע ולא רוצה להעביר דברים פשוטים ואז אני חושב שהבעיה בהקוד שלי :cool: עד שאני משחק עוד ועוד ואני חוזר להקוד המקורי ואזזז זה עובד :cool::cool:
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קכז

א שִׁיר הַמַּעֲלוֹת לִשְׁלֹמֹה אִם יְהוָה לֹא יִבְנֶה בַיִת שָׁוְא עָמְלוּ בוֹנָיו בּוֹ אִם יְהוָה לֹא יִשְׁמָר עִיר שָׁוְא שָׁקַד שׁוֹמֵר:ב שָׁוְא לָכֶם מַשְׁכִּימֵי קוּם מְאַחֲרֵי שֶׁבֶת אֹכְלֵי לֶחֶם הָעֲצָבִים כֵּן יִתֵּן לִידִידוֹ שֵׁנָא:ג הִנֵּה נַחֲלַת יְהוָה בָּנִים שָׂכָר פְּרִי הַבָּטֶן:ד כְּחִצִּים בְּיַד גִּבּוֹר כֵּן בְּנֵי הַנְּעוּרִים:ה אַשְׁרֵי הַגֶּבֶר אֲשֶׁר מִלֵּא אֶת אַשְׁפָּתוֹ מֵהֶם לֹא יֵבֹשׁוּ כִּי יְדַבְּרוּ אֶת אוֹיְבִים בַּשָּׁעַר:
נקרא  33  פעמים

אתגר AI

אחרי החגים • אתגר 13

לוח מודעות

למעלה