سؤال

أحاول قراءة المتغيرات من ملف دفعة لاستخدامه لاحقًا في البرنامج النصي الدُفعات ، وهو قاذفة Java. أود من الناحية المثالية أن أحصل على نفس التنسيق لملف الإعدادات على جميع الأنظمة الأساسية (UNIX ، Windows) ، وأيضًا أن أكون ملف Java Properties صالح. هذا هو ، يجب أن يبدو هكذا:

setting1=Value1
setting2=Value2
...

هل من الممكن قراءة مثل هذه القيم كما تفعل في برنامج نصي UNIX Shell؟ يمكن أن تبدو شيء من هذا القبيل:

READ settingsfile.xy
java -Dsetting1=%setting1% ...

أعلم أن هذا ممكن مع SET setting1=Value1, ، لكنني حقًا أفضل تنسيق الملف نفسه للإعدادات على جميع المنصات.

للتوضيح: أحتاج إلى القيام بذلك في بيئة سطر/الدُفعة حيث أحتاج أيضًا إلى تعيين معلمات لا يمكن تغييرها من داخل JVM ، مثل -xmx أو -classpath.

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك في ملف دفعة على النحو التالي:

setlocal
FOR /F "tokens=*" %%i in ('type Settings.txt') do SET %%i
java -Dsetting1=%setting1% ...
endlocal

يقرأ هذا ملفًا نصيًا يحتوي على سلاسل مثل "Setting1 = value1" والمكالمات تعيينها لتعيينها كمتغيرات بيئة.

يتم استخدام setlocal/endlocal للحد من نطاق متغيرات البيئة لتنفيذ ملف الدُفعة الخاص بك.

معالج CMD أمر قوي في الواقع ، على الرغم من بناء جملة بيزنطية.

نصائح أخرى

يمكنك تمرير ملف الخاصية كمعلمة إلى برنامج Java (قد يطلق البرنامج الرئيسي لاحقًا). ثم الاستفادة من نموذج منصة متعددة.

قد يكون من الحكمة استيراد متغيرات محددة فقط من ملف الخصائص (تلك التي تعرف عنها مسبقًا) ، في هذه الحالة أوصي بوظيفة مثل ما يلي:

:parsePropertiesFile
    set PROPS_FILE=%1
    shift
    :propLoop
    if "%1"=="" goto:eof
    FOR /F "tokens=*" %%i in ('type %PROPS_FILE% ^| findStr.exe "%1="') do SET %%i
    shift
    GOTO propLoop
goto:eof

التي سيتم استدعاؤها من قبل call:parsePropertiesFile props.properties setting1 setting2 لتعيين المتغيرات Setting1 و Setting2

يمكنك أيضًا الوصول إلى متغيرات بيئة نظام التشغيل من داخل برنامج Java:

import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n", envName, env.get(envName));
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top