التنفيذ الشرطي (&& و ||) في بوويرشيل
-
20-09-2019 - |
سؤال
هناك بالفعل سؤال يتناول مشكلتي (هل يمكنني الحصول على && للعمل في Powershell؟)، ولكن مع فارق واحد.انا بحاجة الى انتاج من كلا الأمرين.انظر، إذا قمت فقط بتشغيل:
(command1 -arg1 -arg2) -and (command2 -arg1)
لن أرى أي إخراج، ولكن رسائل stderr.وكما هو متوقع، فقط اكتب:
command1 -arg1 -arg2 -and command2 -arg1
يعطي خطأ في بناء الجملة.
المحلول
<القوي> 2019 : في فريق بوويرشيل و تفكر في إضافة الدعم ل&&
ل بوويرشيل - في وزن هذا جيثب PR
وجرب هذا:
$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)
وو$()
هو التعبير الجزئي مما يسمح لك لتحديد عبارات متعددة ضمن بما في ذلك خط أنابيب. ثم تنفيذ الأمر والأنابيب لOut-Host
حتى تتمكن من رؤيتها. البيان التالي (الانتاج الفعلي من التعبير الجزئي) ينبغي $?
إخراج أي نتيجة نجاح الأمر الماضي.
والغرامة أعمال $?
لأوامر الأم (ملف حدة التحكم)، ولكن لأوامر cmdlets فإنه يترك شيئا إلى المستوى المطلوب. وهذا هو، يبدو $?
الوحيد لعودة $false
عندما يصادف أمر cmdlet خطأ إنهاء. يبدو احتياجات $?
ثلاث ولايات على الأقل (فشلت، نجح ونجح جزئيا). حتى إذا كنت تستخدم أوامر cmdlets، وهذا يعمل على نحو أفضل:
$(command -arg1 -arg2 -ev err | Out-Host;!$err) -and
$(command -arg1 -ev err | Out-Host;!$err)
وهذا النوع من الضربات حتى الآن. ولعل شيئا من هذا القبيل سيكون أفضل:
function ExecuteUntilError([scriptblock[]]$Scriptblock)
{
foreach ($sb in $scriptblock)
{
$prevErr = $error[0]
. $sb
if ($error[0] -ne $prevErr) { break }
}
}
ExecuteUntilError {command -arg1 -arg2},{command2-arg1}
نصائح أخرى
لتبسيط مخطوطات متعددة الخطوات حيث <م> doThis || خروج 1 م> سيكون من المفيد حقا، وأنا استخدم شيئا مثل:
function ProceedOrExit {
if ($?) { echo "Proceed.." } else { echo "Script FAILED! Exiting.."; exit 1 }
}
doThis; ProceedOrExit
doNext
# or for long doos
doThis
ProceedOrExit
doNext
باش /
cmd
'س&&
و||
مشغلي التحكم ليس لديهم مكافئات PowerShell, وبما أنه لا يمكنك تحديد عوامل التشغيل المخصصة في PowerShell، فهناك لا توجد حلول جيدة.- ال
| Out-Host
الحل القائم على إجابة كيث هيل يعد محدودًا للغاية لأنه يمكنه فقط إرسال إخراج الأمر العادي إلى وحدة التحكم (المحطة الطرفية)، مما يمنع إرسال المخرجات عبر خط الأنابيب أو التقاطها في متغير أو ملف.
- ال
العثور على معلومات أساسية في هذه الإجابة خاصتي.
وأبسط حل هو استخدام
powershell command1 && powershell command2
وفي قذيفة كمد. وبطبيعة الحال، لا يمكنك استخدام هذا في برنامج نصي .ps1، ولذلك لا يوجد هذا القيد.
وليتل أطول طريقة أنظر أدناه
try {
hostname
if ($lastexitcode -eq 0) {
ipconfig /all | findstr /i bios
}
} catch {
echo err
} finally {}