سؤال

أواجه بعض المشاكل في الحصول على .getruntime.exec() للعمل بشكل صحيح.هنا هو رمز التعامل مع هذا الجزء:

while (line != null)
{
  String name = line;
  String commandFull = commandFirst + name + commandLast;

  String[] fullCommand = new String[] {commandFirst, name, commandLast};
  for(int i=0;i<3;i++)
  {
    System.out.print(fullCommand[i]);
  }
  Runtime runner = Runtime.getRuntime();
  Process p = runner.exec(fullCommand);

  outFile.println(fullCommand);

  line = inFile.readLine();
}

فإنه يطبع الأمر كما يجب أن تبدو.عند تشغيل البرنامج هنا هو الإخراج:

adfind -b dc=stuff,dc=com -f "cn=user" |find "displayName" >> fullList.txt
Exception in thread "main" java.lang.IllegalArgumentException
        at java.lang.ProcessImpl.<init>(Unknown Source)
        at java.lang.ProcessImpl.start(Unknown Source)
        at java.lang.ProcessBuilder.start(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at lookup.main(lookup.java:41)
هل كانت مفيدة؟

المحلول

تحاول تنفيذ أمر Shell بدون قذيفة.

وهذا هو، تحاول تنفيذ شيء سوف تفسر قذيفة (على وجه التحديد الأنابيب '|' وإلحاق '>>'). لحل هذا، قم بتنفيذ Java مثيل Shell وتمرير الأمر بأكمله إلى Shell. كيف سيعمل ذلك من خلال النظام الأساسي.

على سبيل المثال في Linux:

String fullCommand = {"/bin/sh", "-c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};

أو في ويندوز:

String fullCommand = {"cmd.exe", "/c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};

نصائح أخرى

الانتشرات والأنابيب لا تعمل - فهي ليست جزءا من الأمر، ولكن تعتمد على القشرة الأساسية ليتم تقييمها عند تشغيل هذا الخط من EG من نافذة CMD.EXE.

ستحتاج إلى استخدام تدفقات المدخلات والإخراج لكائن العملية تحصل عليها من طريقة EXEC ().

إذا كان اهتمامك الرئيسي هو الاستعلام عن Active Directory، فلا تستخدم أداة الاستعلام المحددة في متناول اليد، يجب أن تفكر في الذهاب للحصول على حل جافا. هناك عدة طرق للوصول إلى أدلة LDAP (أي الدليل النشط أيضا)، على سبيل المثال هنا:

http://developer.novell.com/wiki/index.php/jldap.

لم أستخدمها بنفسي بعد، لكنها لا تبدو مهجورة حيث توجد إصدارات من عام 2008.

أعتقد أن "إلحاق" (>>) و "الأنابيب" (|) غير مسموح به.

يمكنك أن تجربها عن طريق إعطاء كل عنصر مكان في الصفيف:

String [] command = {"adfind" "-b" "dc=stuff,dc=com" "-f" "cn=user" "|" "find" "displayName" ">>" "fullList.tx" }

ونرى ما يحدث.

كما أشار آخرون ، لا يمكنك إجراء المعياري/err إعادة توجيه عبر قذيفة تعليمات منذ لم يكن لديك قذيفة.

سوف تحتاج إلى تستهلك المعياري/stderr في المواضيع المنفصلة ، لمنع الحجب.انظر هذا الجواب للحصول على مزيد من المعلومات.

في النهاية (ونعم، كان هذا قليلا من الطريقة السريعة والقذرة) انتهيت من الاتصال بملف .bat الذي يقوم بتنفيذ الأمر واستخدم الأنابيب وإعادة التوجيه. أنا متأكد من أنه ليس أفضل حل لكنه يعمل من أجل ما أحتاج إليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top