سؤال

هناك بالفعل سؤال يتناول مشكلتي (هل يمكنني الحصول على && للعمل في 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 {}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top