精华内容
下载资源
问答
  • windows 命令行参数解析编程 Linux系统下处理命令行参数的编程比较简单,使用getopt即可快速的处理。 windowds系统下,没有getopt函数处理命令行参数,但是可以对getopt的源码进行简单的修改即可在windows程序进行...

    windows 命令行参数解析编程

    Linux系统下处理命令行参数的编程比较简单,使用getopt即可快速的处理。

    windowds系统下,没有getopt函数处理命令行参数,但是可以对getopt的源码进行简单的修改即可在windows程序进行命令行参数处理。

    示例如下:

    // getopt.h

    /* Declarations for getopt.
       Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009,2010
       Free Software Foundation, Inc.
       This file is part of the GNU C Library.
    
       The GNU C Library is free software; you can redistribute it and/or
       modify it under the terms of the GNU Lesser General Public
       License as published by the Free Software Foundation; either
       version 2.1 of the License, or (at your option) any later version.
    
       The GNU C Library is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       Lesser General Public License for more details.
    
       You should have received a copy of the GNU Lesser General Public
       License along with the GNU C Library; if not, write to the Free
       Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
       02111-1307 USA.  */
    
    #ifndef _GETOPT_H
    
    #ifndef __need_getopt
    #define _GETOPT_H 1
    #endif
    
    /* If __GNU_LIBRARY__ is not already defined, either we are being used
       standalone, or this is the first header included in the source file.
       If we are being used with glibc, we need to include <features.h>, but
       that does not exist if we are standalone.  So: if __GNU_LIBRARY__ is
       not defined, include <ctype.h>, which will pull in <features.h> for us
       if it's from glibc.  (Why ctype.h?  It's guaranteed to exist and it
       doesn't flood the namespace with stuff the way some other headers do.)  */
    #if !defined __GNU_LIBRARY__
    #include <ctype.h>
    #endif
    
    #ifndef __THROW
    #ifndef __GNUC_PREREQ
    #define __GNUC_PREREQ(maj, min) (0)
    #endif
    #if defined __cplusplus && __GNUC_PREREQ (2,8)
    #define __THROW	throw ()
    #else
    #define __THROW
    #endif
    #endif
    
    #ifdef	__cplusplus
    extern "C" {
    #endif
    
    /* For communication from `getopt' to the caller.
       When `getopt' finds an option that takes an argument,
       the argument value is returned here.
       Also, when `ordering' is RETURN_IN_ORDER,
       each non-option ARGV-element is returned here.  */
    
    extern char *optarg;
    
    /* Index in ARGV of the next element to be scanned.
       This is used for communication to and from the caller
       and for communication between successive calls to `getopt'.
    
       On entry to `getopt', zero means this is the first call; initialize.
    
       When `getopt' returns -1, this is the index of the first of the
       non-option elements that the caller should itself scan.
    
       Otherwise, `optind' communicates from one call to the next
       how much of ARGV has been scanned so far.  */
    
    extern int optind;
    
    /* Callers store zero here to inhibit the error message `getopt' prints
       for unrecognized options.  */
    
    extern int opterr;
    
    /* Set to an option character which was unrecognized.  */
    
    extern int optopt;
    
    #ifndef __need_getopt
    /* Describe the long-named options requested by the application.
       The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
       of `struct option' terminated by an element containing a name which is
       zero.
    
       The field `has_arg' is:
       no_argument		(or 0) if the option does not take an argument,
       required_argument	(or 1) if the option requires an argument,
       optional_argument 	(or 2) if the option takes an optional argument.
    
       If the field `flag' is not NULL, it points to a variable that is set
       to the value given in the field `val' when the option is found, but
       left unchanged if the option is not found.
    
       To have a long-named option do something other than set an `int' to
       a compiled-in constant, such as set a value from `optarg', set the
       option's `flag' field to zero and its `val' field to a nonzero
       value (the equivalent single-letter option character, if there is
       one).  For long options that have a zero `flag' field, `getopt'
       returns the contents of the `val' field.  */
    
    struct option
    {
      const char *name;
      /* has_arg can't be an enum because some compilers complain about
         type mismatches in all the code that assumes it is an int.  */
      int has_arg;
      int *flag;
      int val;
    };
    
    /* Names for the values of the `has_arg' field of `struct option'.  */
    
    #define no_argument		0
    #define required_argument	1
    #define optional_argument	2
    #endif	/* need getopt */
    
    
    /* Get definitions and prototypes for functions to process the
       arguments in ARGV (ARGC of them, minus the program name) for
       options given in OPTS.
    
       Return the option character from OPTS just read.  Return -1 when
       there are no more options.  For unrecognized options, or options
       missing arguments, `optopt' is set to the option letter, and '?' is
       returned.
    
       The OPTS string is a list of characters which are recognized option
       letters, optionally followed by colons, specifying that that letter
       takes an argument, to be placed in `optarg'.
    
       If a letter in OPTS is followed by two colons, its argument is
       optional.  This behavior is specific to the GNU `getopt'.
    
       The argument `--' causes premature termination of argument
       scanning, explicitly telling `getopt' that there are no more
       options.
    
       If OPTS begins with `--', then non-option arguments are treated as
       arguments to the option '\0'.  This behavior is specific to the GNU
       `getopt'.  */
    
    #ifdef __GNU_LIBRARY__
    /* Many other libraries have conflicting prototypes for getopt, with
       differences in the consts, in stdlib.h.  To avoid compilation
       errors, only prototype getopt for the GNU C library.  */
    extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
           __THROW;
    
    #if defined __need_getopt && defined __USE_POSIX2 \
      && !defined __USE_POSIX_IMPLICITLY && !defined __USE_GNU
    /* The GNU getopt has more functionality than the standard version.  The
       additional functionality can be disable at runtime.  This redirection
       helps to also do this at runtime.  */
    #ifdef __REDIRECT
      extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv,
    				      const char *__shortopts),
    			     __posix_getopt);
    #else
    extern int __posix_getopt (int ___argc, char *const *___argv,
    			   const char *__shortopts) __THROW;
    #define getopt __posix_getopt
    #endif
    #endif
    #else /* not __GNU_LIBRARY__ */
    extern int getopt ();
    #endif /* __GNU_LIBRARY__ */
    
    #ifndef __need_getopt
    extern int getopt_long (int ___argc, char *const *___argv,
    			const char *__shortopts,
    		        const struct option *__longopts, int *__longind)
           __THROW;
    extern int getopt_long_only (int ___argc, char *const *___argv,
    			     const char *__shortopts,
    		             const struct option *__longopts, int *__longind)
           __THROW;
    
    #endif
    
    #ifdef	__cplusplus
    }
    #endif
    
    /* Make sure we later can get all the definitions and declarations.  */
    #undef __need_getopt
    
    #endif /* getopt.h */

    // get_opt.c

    /* Getopt for GNU.
    NOTE: getopt is now part of the C library, so if you don't know what
    "Keep this file name-space clean" means, talk to drepper@gnu.org
    before changing it!
    Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.
    
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
    
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, write to the Free
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
    
    /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
    Ditto for AIX 3.2 and <stdlib.h>.  */
    #ifndef _NO_PROTO
    # define _NO_PROTO
    #endif
    
    #ifdef HAVE_CONFIG_H
    # include <config.h>
    #endif
    
    #if !defined __STDC__ || !__STDC__
    /* This is a separate conditional since some stdc systems
    reject `defined (const)'.  */
    # ifndef const
    #  define const
    # endif
    #endif
    
    #include <stdio.h>
    
    /* Comment out all this code if we are using the GNU C Library, and are not
    actually compiling the library itself.  This code is part of the GNU C
    Library, but also included in many other GNU distributions.  Compiling
    and linking in this code is a waste when using the GNU C library
    (especially if it is a shared library).  Rather than having every GNU
    program understand `configure --with-gnu-libc' and omit the object files,
    it is simpler to just do this in the source for each such file.  */
    
    #define GETOPT_INTERFACE_VERSION 2
    #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
    # include <gnu-versions.h>
    # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
    #  define ELIDE_CODE
    # endif
    #endif
    
    #ifndef ELIDE_CODE
    
    
    /* This needs to come after some library #include
    to get __GNU_LIBRARY__ defined.  */
    #ifdef	__GNU_LIBRARY__
    /* Don't include stdlib.h for non-GNU C libraries because some of them
    contain conflicting prototypes for getopt.  */
    # include <stdlib.h>
    # include <unistd.h>
    #endif	/* GNU C library.  */
    
    #ifdef VMS
    # include <unixlib.h>
    # if HAVE_STRING_H - 0
    #  include <string.h>
    # endif
    #endif
    
    #ifndef _
    /* This is for other GNU distributions with internationalized messages.  */
    # if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
    #  include <libintl.h>
    #  ifndef _
    #   define _(msgid)	gettext (msgid)
    #  endif
    # else
    #  define _(msgid)	(msgid)
    # endif
    # if defined _LIBC && defined USE_IN_LIBIO
    #  include <wchar.h>
    # endif
    #endif
    
    /* This version of `getopt' appears to the caller like standard Unix `getopt'
    but it behaves differently for the user, since it allows the user
    to intersperse the options with the other arguments.
    
    As `getopt' works, it permutes the elements of ARGV so that,
    when it is done, all the options precede everything else.  Thus
    all application programs are extended to handle flexible argument order.
    
    Setting the environment variable POSIXLY_CORRECT disables permutation.
    Then the behavior is completely standard.
    
    GNU application programs can use a third alternative mode in which
    they can distinguish the relative order of options and other arguments.  */
    
    #include "getopt.h"
    
    /* For communication from `getopt' to the caller.
    When `getopt' finds an option that takes an argument,
    the argument value is returned here.
    Also, when `ordering' is RETURN_IN_ORDER,
    each non-option ARGV-element is returned here.  */
    
    char *optarg;
    
    /* Index in ARGV of the next element to be scanned.
    This is used for communication to and from the caller
    and for communication between successive calls to `getopt'.
    
    On entry to `getopt', zero means this is the first call; initialize.
    
    When `getopt' returns -1, this is the index of the first of the
    non-option elements that the caller should itself scan.
    
    Otherwise, `optind' communicates from one call to the next
    how much of ARGV has been scanned so far.  */
    
    /* 1003.2 says this must be 1 before any call.  */
    int optind = 1;
    
    /* Formerly, initialization of getopt depended on optind==0, which
    causes problems with re-calling getopt as programs generally don't
    know that. */
    
    int __getopt_initialized;
    
    /* The next char to be scanned in the option-element
    in which the last option character we returned was found.
    This allows us to pick up the scan where we left off.
    
    If this is zero, or a null string, it means resume the scan
    by advancing to the next ARGV-element.  */
    
    static char *nextchar;
    
    /* Callers store zero here to inhibit the error message
    for unrecognized options.  */
    
    int opterr = 1;
    
    /* Set to an option character which was unrecognized.
    This must be initialized on some systems to avoid linking in the
    system's own getopt implementation.  */
    
    int optopt = '?';
    
    /* Describe how to deal with options that follow non-option ARGV-elements.
    
    If the caller did not specify anything,
    the default is REQUIRE_ORDER if the environment variable
    POSIXLY_CORRECT is defined, PERMUTE otherwise.
    
    REQUIRE_ORDER means don't recognize them as options;
    stop option processing when the first non-option is seen.
    This is what Unix does.
    This mode of operation is selected by either setting the environment
    variable POSIXLY_CORRECT, or using `+' as the first character
    of the list of option characters.
    
    PERMUTE is the default.  We permute the contents of ARGV as we scan,
    so that eventually all the non-options are at the end.  This allows options
    to be given in any order, even with programs that were not written to
    expect this.
    
    RETURN_IN_ORDER is an option available to programs that were written
    to expect options and other ARGV-elements in any order and that care about
    the ordering of the two.  We describe each non-option ARGV-element
    as if it were the argument of an option with character code 1.
    Using `-' as the first character of the list of option characters
    selects this mode of operation.
    
    The special argument `--' forces an end of option-scanning regardless
    of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
    `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
    
    static enum
    {
    	REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
    } ordering;
    
    /* Value of POSIXLY_CORRECT environment variable.  */
    static char *posixly_correct;
    
    #ifdef	__GNU_LIBRARY__
    /* We want to avoid inclusion of string.h with non-GNU libraries
    because there are many ways it can cause trouble.
    On some systems, it contains special magic macros that don't work
    in GCC.  */
    # include <string.h>
    # define my_index	strchr
    #else
    
    #define HAVE_STRING_H 1
    # if HAVE_STRING_H
    #  include <string.h>
    # else
    #  include <strings.h>
    # endif
    
    /* Avoid depending on library functions or files
    whose names are inconsistent.  */
    
    #ifndef getenv
    extern char *getenv();
    #endif
    
    static char *
    my_index(str, chr)
    const char *str;
    int chr;
    {
    	while (*str)
    	{
    		if (*str == chr)
    			return (char *)str;
    		str++;
    	}
    	return 0;
    }
    
    /* If using GCC, we can safely declare strlen this way.
    If not using GCC, it is ok not to declare it.  */
    #ifdef __GNUC__
    /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
    That was relevant to code that was here before.  */
    # if (!defined __STDC__ || !__STDC__) && !defined strlen
    /* gcc with -traditional declares the built-in strlen to return int,
    and has done so at least since version 2.4.5. -- rms.  */
    extern int strlen(const char *);
    # endif /* not __STDC__ */
    #endif /* __GNUC__ */
    
    #endif /* not __GNU_LIBRARY__ */
    
    /* Handle permutation of arguments.  */
    
    /* Describe the part of ARGV that contains non-options that have
    been skipped.  `first_nonopt' is the index in ARGV of the first of them;
    `last_nonopt' is the index after the last of them.  */
    
    static int first_nonopt;
    static int last_nonopt;
    
    #ifdef _LIBC
    /* Stored original parameters.
    XXX This is no good solution.  We should rather copy the args so
    that we can compare them later.  But we must not use malloc(3).  */
    extern int __libc_argc;
    extern char **__libc_argv;
    
    /* Bash 2.0 gives us an environment variable containing flags
    indicating ARGV elements that should not be considered arguments.  */
    
    # ifdef USE_NONOPTION_FLAGS
    /* Defined in getopt_init.c  */
    extern char *__getopt_nonoption_flags;
    
    static int nonoption_flags_max_len;
    static int nonoption_flags_len;
    # endif
    
    # ifdef USE_NONOPTION_FLAGS
    #  define SWAP_FLAGS(ch1, ch2) \
    if (nonoption_flags_len > 0)						      \
    {									      \
    	char __tmp = __getopt_nonoption_flags[ch1];			      \
    	__getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
    	__getopt_nonoption_flags[ch2] = __tmp;				      \
    }
    # else
    #  define SWAP_FLAGS(ch1, ch2)
    # endif
    #else	/* !_LIBC */
    # define SWAP_FLAGS(ch1, ch2)
    #endif	/* _LIBC */
    
    /* Exchange two adjacent subsequences of ARGV.
    One subsequence is elements [first_nonopt,last_nonopt)
    which contains all the non-options that have been skipped so far.
    The other is elements [last_nonopt,optind), which contains all
    the options processed since those non-options were skipped.
    
    `first_nonopt' and `last_nonopt' are relocated so that they describe
    the new indices of the non-options in ARGV after they are moved.  */
    
    #if defined __STDC__ && __STDC__
    static void exchange(char **);
    #endif
    
    static void
    exchange(argv)
    char **argv;
    {
    	int bottom = first_nonopt;
    	int middle = last_nonopt;
    	int top = optind;
    	char *tem;
    
    	/* Exchange the shorter segment with the far end of the longer segment.
    	That puts the shorter segment into the right place.
    	It leaves the longer segment in the right place overall,
    	but it consists of two parts that need to be swapped next.  */
    
    #if defined _LIBC && defined USE_NONOPTION_FLAGS
    	/* First make sure the handling of the `__getopt_nonoption_flags'
    	string can work normally.  Our top argument must be in the range
    	of the string.  */
    	if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
    	{
    		/* We must extend the array.  The user plays games with us and
    		presents new arguments.  */
    		char *new_str = malloc(top + 1);
    		if (new_str == NULL)
    			nonoption_flags_len = nonoption_flags_max_len = 0;
    		else
    		{
    			memset(__mempcpy(new_str, __getopt_nonoption_flags,
    				nonoption_flags_max_len),
    				'\0', top + 1 - nonoption_flags_max_len);
    			nonoption_flags_max_len = top + 1;
    			__getopt_nonoption_flags = new_str;
    		}
    	}
    #endif
    
    	while (top > middle && middle > bottom)
    	{
    		if (top - middle > middle - bottom)
    		{
    			/* Bottom segment is the short one.  */
    			int len = middle - bottom;
    			register int i;
    
    			/* Swap it with the top part of the top segment.  */
    			for (i = 0; i < len; i++)
    			{
    				tem = argv[bottom + i];
    				argv[bottom + i] = argv[top - (middle - bottom) + i];
    				argv[top - (middle - bottom) + i] = tem;
    				SWAP_FLAGS(bottom + i, top - (middle - bottom) + i);
    			}
    			/* Exclude the moved bottom segment from further swapping.  */
    			top -= len;
    		}
    		else
    		{
    			/* Top segment is the short one.  */
    			int len = top - middle;
    			register int i;
    
    			/* Swap it with the bottom part of the bottom segment.  */
    			for (i = 0; i < len; i++)
    			{
    				tem = argv[bottom + i];
    				argv[bottom + i] = argv[middle + i];
    				argv[middle + i] = tem;
    				SWAP_FLAGS(bottom + i, middle + i);
    			}
    			/* Exclude the moved top segment from further swapping.  */
    			bottom += len;
    		}
    	}
    
    	/* Update records for the slots the non-options now occupy.  */
    
    	first_nonopt += (optind - last_nonopt);
    	last_nonopt = optind;
    }
    
    /* Initialize the internal data when the first call is made.  */
    
    #if defined __STDC__ && __STDC__
    static const char *_getopt_initialize(int, char *const *, const char *);
    #endif
    static const char *
    _getopt_initialize(argc, argv, optstring)
    int argc;
    char *const *argv;
    const char *optstring;
    {
    	/* Start processing options with ARGV-element 1 (since ARGV-element 0
    	is the program name); the sequence of previously skipped
    	non-option ARGV-elements is empty.  */
    
    	first_nonopt = last_nonopt = optind;
    
    	nextchar = NULL;
    
    	posixly_correct = getenv("POSIXLY_CORRECT");
    
    	/* Determine how to handle the ordering of options and nonoptions.  */
    
    	if (optstring[0] == '-')
    	{
    		ordering = RETURN_IN_ORDER;
    		++optstring;
    	}
    	else if (optstring[0] == '+')
    	{
    		ordering = REQUIRE_ORDER;
    		++optstring;
    	}
    	else if (posixly_correct != NULL)
    		ordering = REQUIRE_ORDER;
    	else
    		ordering = PERMUTE;
    
    #if defined _LIBC && defined USE_NONOPTION_FLAGS
    	if (posixly_correct == NULL
    		&& argc == __libc_argc && argv == __libc_argv)
    	{
    		if (nonoption_flags_max_len == 0)
    		{
    			if (__getopt_nonoption_flags == NULL
    				|| __getopt_nonoption_flags[0] == '\0')
    				nonoption_flags_max_len = -1;
    			else
    			{
    				const char *orig_str = __getopt_nonoption_flags;
    				int len = nonoption_flags_max_len = strlen(orig_str);
    				if (nonoption_flags_max_len < argc)
    					nonoption_flags_max_len = argc;
    				__getopt_nonoption_flags =
    					(char *)malloc(nonoption_flags_max_len);
    				if (__getopt_nonoption_flags == NULL)
    					nonoption_flags_max_len = -1;
    				else
    					memset(__mempcpy(__getopt_nonoption_flags, orig_str, len),
    					'\0', nonoption_flags_max_len - len);
    			}
    		}
    		nonoption_flags_len = nonoption_flags_max_len;
    	}
    	else
    		nonoption_flags_len = 0;
    #endif
    
    	return optstring;
    }
    
    /* Scan elements of ARGV (whose length is ARGC) for option characters
    given in OPTSTRING.
    
    If an element of ARGV starts with '-', and is not exactly "-" or "--",
    then it is an option element.  The characters of this element
    (aside from the initial '-') are option characters.  If `getopt'
    is called repeatedly, it returns successively each of the option characters
    from each of the option elements.
    
    If `getopt' finds another option character, it returns that character,
    updating `optind' and `nextchar' so that the next call to `getopt' can
    resume the scan with the following option character or ARGV-element.
    
    If there are no more option characters, `getopt' returns -1.
    Then `optind' is the index in ARGV of the first ARGV-element
    that is not an option.  (The ARGV-elements have been permuted
    so that those that are not options now come last.)
    
    OPTSTRING is a string containing the legitimate option characters.
    If an option character is seen that is not listed in OPTSTRING,
    return '?' after printing an error message.  If you set `opterr' to
    zero, the error message is suppressed but we still return '?'.
    
    If a char in OPTSTRING is followed by a colon, that means it wants an arg,
    so the following text in the same ARGV-element, or the text of the following
    ARGV-element, is returned in `optarg'.  Two colons mean an option that
    wants an optional arg; if there is text in the current ARGV-element,
    it is returned in `optarg', otherwise `optarg' is set to zero.
    
    If OPTSTRING starts with `-' or `+', it requests different methods of
    handling the non-option ARGV-elements.
    See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
    
    Long-named options begin with `--' instead of `-'.
    Their names may be abbreviated as long as the abbreviation is unique
    or is an exact match for some defined option.  If they have an
    argument, it follows the option name in the same ARGV-element, separated
    from the option name by a `=', or else the in next ARGV-element.
    When `getopt' finds a long-named option, it returns 0 if that option's
    `flag' field is nonzero, the value of the option's `val' field
    if the `flag' field is zero.
    
    The elements of ARGV aren't really const, because we permute them.
    But we pretend they're const in the prototype to be compatible
    with other systems.
    
    LONGOPTS is a vector of `struct option' terminated by an
    element containing a name which is zero.
    
    LONGIND returns the index in LONGOPT of the long-named option found.
    It is only valid when a long-named option has been found by the most
    recent call.
    
    If LONG_ONLY is nonzero, '-' as well as '--' can introduce
    long-named options.  */
    
    int
    _getopt_internal(argc, argv, optstring, longopts, longind, long_only)
    int argc;
    char *const *argv;
    const char *optstring;
    const struct option *longopts;
    int *longind;
    int long_only;
    {
    	int print_errors = opterr;
    	if (optstring[0] == ':')
    		print_errors = 0;
    
    	if (argc < 1)
    		return -1;
    
    	optarg = NULL;
    
    	if (optind == 0 || !__getopt_initialized)
    	{
    		if (optind == 0)
    			optind = 1;	/* Don't scan ARGV[0], the program name.  */
    		optstring = _getopt_initialize(argc, argv, optstring);
    		__getopt_initialized = 1;
    	}
    
    	/* Test whether ARGV[optind] points to a non-option argument.
    	Either it does not have option syntax, or there is an environment flag
    	from the shell indicating it is not an option.  The later information
    	is only used when the used in the GNU libc.  */
    #if defined _LIBC && defined USE_NONOPTION_FLAGS
    # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'	      \
    	|| (optind < nonoption_flags_len			      \
    	&& __getopt_nonoption_flags[optind] == '1'))
    #else
    # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
    #endif
    
    	if (nextchar == NULL || *nextchar == '\0')
    	{
    		/* Advance to the next ARGV-element.  */
    
    		/* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
    		moved back by the user (who may also have changed the arguments).  */
    		if (last_nonopt > optind)
    			last_nonopt = optind;
    		if (first_nonopt > optind)
    			first_nonopt = optind;
    
    		if (ordering == PERMUTE)
    		{
    			/* If we have just processed some options following some non-options,
    			exchange them so that the options come first.  */
    
    			if (first_nonopt != last_nonopt && last_nonopt != optind)
    				exchange((char **)argv);
    			else if (last_nonopt != optind)
    				first_nonopt = optind;
    
    			/* Skip any additional non-options
    			and extend the range of non-options previously skipped.  */
    
    			while (optind < argc && NONOPTION_P)
    				optind++;
    			last_nonopt = optind;
    		}
    
    		/* The special ARGV-element `--' means premature end of options.
    		Skip it like a null option,
    		then exchange with previous non-options as if it were an option,
    		then skip everything else like a non-option.  */
    
    		if (optind != argc && !strcmp(argv[optind], "--"))
    		{
    			optind++;
    
    			if (first_nonopt != last_nonopt && last_nonopt != optind)
    				exchange((char **)argv);
    			else if (first_nonopt == last_nonopt)
    				first_nonopt = optind;
    			last_nonopt = argc;
    
    			optind = argc;
    		}
    
    		/* If we have done all the ARGV-elements, stop the scan
    		and back over any non-options that we skipped and permuted.  */
    
    		if (optind == argc)
    		{
    			/* Set the next-arg-index to point at the non-options
    			that we previously skipped, so the caller will digest them.  */
    			if (first_nonopt != last_nonopt)
    				optind = first_nonopt;
    			return -1;
    		}
    
    		/* If we have come to a non-option and did not permute it,
    		either stop the scan or describe it to the caller and pass it by.  */
    
    		if (NONOPTION_P)
    		{
    			if (ordering == REQUIRE_ORDER)
    				return -1;
    			optarg = argv[optind++];
    			return 1;
    		}
    
    		/* We have found another option-ARGV-element.
    		Skip the initial punctuation.  */
    
    		nextchar = (argv[optind] + 1
    			+ (longopts != NULL && argv[optind][1] == '-'));
    	}
    
    	/* Decode the current option-ARGV-element.  */
    
    	/* Check whether the ARGV-element is a long option.
    
    	If long_only and the ARGV-element has the form "-f", where f is
    	a valid short option, don't consider it an abbreviated form of
    	a long option that starts with f.  Otherwise there would be no
    	way to give the -f short option.
    
    	On the other hand, if there's a long option "fubar" and
    	the ARGV-element is "-fu", do consider that an abbreviation of
    	the long option, just like "--fu", and not "-f" with arg "u".
    
    	This distinction seems to be the most useful approach.  */
    
    	if (longopts != NULL
    		&& (argv[optind][1] == '-'
    		|| (long_only && (argv[optind][2] || !my_index(optstring, argv[optind][1])))))
    	{
    		char *nameend;
    		const struct option *p;
    		const struct option *pfound = NULL;
    		int exact = 0;
    		int ambig = 0;
    		int indfound = -1;
    		int option_index;
    
    		for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
    			/* Do nothing.  */;
    
    		/* Test all long options for either exact match
    		or abbreviated matches.  */
    		for (p = longopts, option_index = 0; p->name; p++, option_index++)
    		if (!strncmp(p->name, nextchar, nameend - nextchar))
    		{
    			if ((unsigned int)(nameend - nextchar)
    				== (unsigned int)strlen(p->name))
    			{
    				/* Exact match found.  */
    				pfound = p;
    				indfound = option_index;
    				exact = 1;
    				break;
    			}
    			else if (pfound == NULL)
    			{
    				/* First nonexact match found.  */
    				pfound = p;
    				indfound = option_index;
    			}
    			else if (long_only
    				|| pfound->has_arg != p->has_arg
    				|| pfound->flag != p->flag
    				|| pfound->val != p->val)
    				/* Second or later nonexact match found.  */
    				ambig = 1;
    		}
    
    		if (ambig && !exact)
    		{
    			if (print_errors)
    			{
    #if defined _LIBC && defined USE_IN_LIBIO
    				char *buf;
    
    				__asprintf(&buf, _("%s: option `%s' is ambiguous\n"),
    					argv[0], argv[optind]);
    
    				if (_IO_fwide(stderr, 0) > 0)
    					__fwprintf(stderr, L"%s", buf);
    				else
    					fputs(buf, stderr);
    
    				free(buf);
    #else
    				fprintf(stderr, _("%s: option `%s' is ambiguous\n"),
    					argv[0], argv[optind]);
    #endif
    			}
    			nextchar += strlen(nextchar);
    			optind++;
    			optopt = 0;
    			return '?';
    		}
    
    		if (pfound != NULL)
    		{
    			option_index = indfound;
    			optind++;
    			if (*nameend)
    			{
    				/* Don't test has_arg with >, because some C compilers don't
    				allow it to be used on enums.  */
    				if (pfound->has_arg)
    					optarg = nameend + 1;
    				else
    				{
    					if (print_errors)
    					{
    #if defined _LIBC && defined USE_IN_LIBIO
    						char *buf;
    #endif
    
    						if (argv[optind - 1][1] == '-')
    						{
    							/* --option */
    #if defined _LIBC && defined USE_IN_LIBIO
    							__asprintf(&buf, _("\
    											   %s: option `--%s' doesn't allow an argument\n"),
    											   argv[0], pfound->name);
    #else
    							fprintf(stderr, _("\
    											  %s: option `--%s' doesn't allow an argument\n"),
    											  argv[0], pfound->name);
    #endif
    						}
    						else
    						{
    							/* +option or -option */
    #if defined _LIBC && defined USE_IN_LIBIO
    							__asprintf(&buf, _("\
    											   %s: option `%c%s' doesn't allow an argument\n"),
    											   argv[0], argv[optind - 1][0],
    											   pfound->name);
    #else
    							fprintf(stderr, _("\
    											  %s: option `%c%s' doesn't allow an argument\n"),
    											  argv[0], argv[optind - 1][0], pfound->name);
    #endif
    						}
    
    #if defined _LIBC && defined USE_IN_LIBIO
    						if (_IO_fwide(stderr, 0) > 0)
    							__fwprintf(stderr, L"%s", buf);
    						else
    							fputs(buf, stderr);
    
    						free(buf);
    #endif
    					}
    
    					nextchar += strlen(nextchar);
    
    					optopt = pfound->val;
    					return '?';
    				}
    			}
    			else if (pfound->has_arg == 1)
    			{
    				if (optind < argc)
    					optarg = argv[optind++];
    				else
    				{
    					if (print_errors)
    					{
    #if defined _LIBC && defined USE_IN_LIBIO
    						char *buf;
    
    						__asprintf(&buf,
    							_("%s: option `%s' requires an argument\n"),
    							argv[0], argv[optind - 1]);
    
    						if (_IO_fwide(stderr, 0) > 0)
    							__fwprintf(stderr, L"%s", buf);
    						else
    							fputs(buf, stderr);
    
    						free(buf);
    #else
    						fprintf(stderr,
    							_("%s: option `%s' requires an argument\n"),
    							argv[0], argv[optind - 1]);
    #endif
    					}
    					nextchar += strlen(nextchar);
    					optopt = pfound->val;
    					return optstring[0] == ':' ? ':' : '?';
    				}
    			}
    			nextchar += strlen(nextchar);
    			if (longind != NULL)
    				*longind = option_index;
    			if (pfound->flag)
    			{
    				*(pfound->flag) = pfound->val;
    				return 0;
    			}
    			return pfound->val;
    		}
    
    		/* Can't find it as a long option.  If this is not getopt_long_only,
    		or the option starts with '--' or is not a valid short
    		option, then it's an error.
    		Otherwise interpret it as a short option.  */
    		if (!long_only || argv[optind][1] == '-'
    			|| my_index(optstring, *nextchar) == NULL)
    		{
    			if (print_errors)
    			{
    #if defined _LIBC && defined USE_IN_LIBIO
    				char *buf;
    #endif
    
    				if (argv[optind][1] == '-')
    				{
    					/* --option */
    #if defined _LIBC && defined USE_IN_LIBIO
    					__asprintf(&buf, _("%s: unrecognized option `--%s'\n"),
    						argv[0], nextchar);
    #else
    					fprintf(stderr, _("%s: unrecognized option `--%s'\n"),
    						argv[0], nextchar);
    #endif
    				}
    				else
    				{
    					/* +option or -option */
    #if defined _LIBC && defined USE_IN_LIBIO
    					__asprintf(&buf, _("%s: unrecognized option `%c%s'\n"),
    						argv[0], argv[optind][0], nextchar);
    #else
    					fprintf(stderr, _("%s: unrecognized option `%c%s'\n"),
    						argv[0], argv[optind][0], nextchar);
    #endif
    				}
    
    #if defined _LIBC && defined USE_IN_LIBIO
    				if (_IO_fwide(stderr, 0) > 0)
    					__fwprintf(stderr, L"%s", buf);
    				else
    					fputs(buf, stderr);
    
    				free(buf);
    #endif
    			}
    			nextchar = (char *) "";
    			optind++;
    			optopt = 0;
    			return '?';
    		}
    	}
    
    	/* Look at and handle the next short option-character.  */
    
    	{
    		char c = *nextchar++;
    		char *temp = my_index(optstring, c);
    
    		/* Increment `optind' when we start to process its last character.  */
    		if (*nextchar == '\0')
    			++optind;
    
    		if (temp == NULL || c == ':')
    		{
    			if (print_errors)
    			{
    #if defined _LIBC && defined USE_IN_LIBIO
    				char *buf;
    #endif
    
    				if (posixly_correct)
    				{
    					/* 1003.2 specifies the format of this message.  */
    #if defined _LIBC && defined USE_IN_LIBIO
    					__asprintf(&buf, _("%s: illegal option -- %c\n"),
    						argv[0], c);
    #else
    					fprintf(stderr, _("%s: illegal option -- %c\n"), argv[0], c);
    #endif
    				}
    				else
    				{
    #if defined _LIBC && defined USE_IN_LIBIO
    					__asprintf(&buf, _("%s: invalid option -- %c\n"),
    						argv[0], c);
    #else
    					fprintf(stderr, _("%s: invalid option -- %c\n"), argv[0], c);
    #endif
    				}
    
    #if defined _LIBC && defined USE_IN_LIBIO
    				if (_IO_fwide(stderr, 0) > 0)
    					__fwprintf(stderr, L"%s", buf);
    				else
    					fputs(buf, stderr);
    
    				free(buf);
    #endif
    			}
    			optopt = c;
    			return '?';
    		}
    		/* Convenience. Treat POSIX -W foo same as long option --foo */
    		if (temp[0] == 'W' && temp[1] == ';')
    		{
    			char *nameend;
    			const struct option *p;
    			const struct option *pfound = NULL;
    			int exact = 0;
    			int ambig = 0;
    			int indfound = 0;
    			int option_index;
    
    			/* This is an option that requires an argument.  */
    			if (*nextchar != '\0')
    			{
    				optarg = nextchar;
    				/* If we end this ARGV-element by taking the rest as an arg,
    				we must advance to the next element now.  */
    				optind++;
    			}
    			else if (optind == argc)
    			{
    				if (print_errors)
    				{
    					/* 1003.2 specifies the format of this message.  */
    #if defined _LIBC && defined USE_IN_LIBIO
    					char *buf;
    
    					__asprintf(&buf, _("%s: option requires an argument -- %c\n"),
    						argv[0], c);
    
    					if (_IO_fwide(stderr, 0) > 0)
    						__fwprintf(stderr, L"%s", buf);
    					else
    						fputs(buf, stderr);
    
    					free(buf);
    #else
    					fprintf(stderr, _("%s: option requires an argument -- %c\n"),
    						argv[0], c);
    #endif
    				}
    				optopt = c;
    				if (optstring[0] == ':')
    					c = ':';
    				else
    					c = '?';
    				return c;
    			}
    			else
    				/* We already incremented `optind' once;
    				increment it again when taking next ARGV-elt as argument.  */
    				optarg = argv[optind++];
    
    			/* optarg is now the argument, see if it's in the
    			table of longopts.  */
    
    			for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
    				/* Do nothing.  */;
    
    			/* Test all long options for either exact match
    			or abbreviated matches.  */
    			for (p = longopts, option_index = 0; p->name; p++, option_index++)
    			if (!strncmp(p->name, nextchar, nameend - nextchar))
    			{
    				if ((unsigned int)(nameend - nextchar) == strlen(p->name))
    				{
    					/* Exact match found.  */
    					pfound = p;
    					indfound = option_index;
    					exact = 1;
    					break;
    				}
    				else if (pfound == NULL)
    				{
    					/* First nonexact match found.  */
    					pfound = p;
    					indfound = option_index;
    				}
    				else
    					/* Second or later nonexact match found.  */
    					ambig = 1;
    			}
    			if (ambig && !exact)
    			{
    				if (print_errors)
    				{
    #if defined _LIBC && defined USE_IN_LIBIO
    					char *buf;
    
    					__asprintf(&buf, _("%s: option `-W %s' is ambiguous\n"),
    						argv[0], argv[optind]);
    
    					if (_IO_fwide(stderr, 0) > 0)
    						__fwprintf(stderr, L"%s", buf);
    					else
    						fputs(buf, stderr);
    
    					free(buf);
    #else
    					fprintf(stderr, _("%s: option `-W %s' is ambiguous\n"),
    						argv[0], argv[optind]);
    #endif
    				}
    				nextchar += strlen(nextchar);
    				optind++;
    				return '?';
    			}
    			if (pfound != NULL)
    			{
    				option_index = indfound;
    				if (*nameend)
    				{
    					/* Don't test has_arg with >, because some C compilers don't
    					allow it to be used on enums.  */
    					if (pfound->has_arg)
    						optarg = nameend + 1;
    					else
    					{
    						if (print_errors)
    						{
    #if defined _LIBC && defined USE_IN_LIBIO
    							char *buf;
    
    							__asprintf(&buf, _("\
    											   %s: option `-W %s' doesn't allow an argument\n"),
    											   argv[0], pfound->name);
    
    							if (_IO_fwide(stderr, 0) > 0)
    								__fwprintf(stderr, L"%s", buf);
    							else
    								fputs(buf, stderr);
    
    							free(buf);
    #else
    							fprintf(stderr, _("\
    											  %s: option `-W %s' doesn't allow an argument\n"),
    											  argv[0], pfound->name);
    #endif
    						}
    
    						nextchar += strlen(nextchar);
    						return '?';
    					}
    				}
    				else if (pfound->has_arg == 1)
    				{
    					if (optind < argc)
    						optarg = argv[optind++];
    					else
    					{
    						if (print_errors)
    						{
    #if defined _LIBC && defined USE_IN_LIBIO
    							char *buf;
    
    							__asprintf(&buf, _("\
    											   %s: option `%s' requires an argument\n"),
    											   argv[0], argv[optind - 1]);
    
    							if (_IO_fwide(stderr, 0) > 0)
    								__fwprintf(stderr, L"%s", buf);
    							else
    								fputs(buf, stderr);
    
    							free(buf);
    #else
    							fprintf(stderr,
    								_("%s: option `%s' requires an argument\n"),
    								argv[0], argv[optind - 1]);
    #endif
    						}
    						nextchar += strlen(nextchar);
    						return optstring[0] == ':' ? ':' : '?';
    					}
    				}
    				nextchar += strlen(nextchar);
    				if (longind != NULL)
    					*longind = option_index;
    				if (pfound->flag)
    				{
    					*(pfound->flag) = pfound->val;
    					return 0;
    				}
    				return pfound->val;
    			}
    			nextchar = NULL;
    			return 'W';	/* Let the application handle it.   */
    		}
    		if (temp[1] == ':')
    		{
    			if (temp[2] == ':')
    			{
    				/* This is an option that accepts an argument optionally.  */
    				if (*nextchar != '\0')
    				{
    					optarg = nextchar;
    					optind++;
    				}
    				else
    					optarg = NULL;
    				nextchar = NULL;
    			}
    			else
    			{
    				/* This is an option that requires an argument.  */
    				if (*nextchar != '\0')
    				{
    					optarg = nextchar;
    					/* If we end this ARGV-element by taking the rest as an arg,
    					we must advance to the next element now.  */
    					optind++;
    				}
    				else if (optind == argc)
    				{
    					if (print_errors)
    					{
    						/* 1003.2 specifies the format of this message.  */
    #if defined _LIBC && defined USE_IN_LIBIO
    						char *buf;
    
    						__asprintf(&buf,
    							_("%s: option requires an argument -- %c\n"),
    							argv[0], c);
    
    						if (_IO_fwide(stderr, 0) > 0)
    							__fwprintf(stderr, L"%s", buf);
    						else
    							fputs(buf, stderr);
    
    						free(buf);
    #else
    						fprintf(stderr,
    							_("%s: option requires an argument -- %c\n"),
    							argv[0], c);
    #endif
    					}
    					optopt = c;
    					if (optstring[0] == ':')
    						c = ':';
    					else
    						c = '?';
    				}
    				else
    					/* We already incremented `optind' once;
    					increment it again when taking next ARGV-elt as argument.  */
    					optarg = argv[optind++];
    				nextchar = NULL;
    			}
    		}
    		return c;
    	}
    }
    
    int
    getopt(argc, argv, optstring)
    int argc;
    char *const *argv;
    const char *optstring;
    {
    	return _getopt_internal(argc, argv, optstring,
    		(const struct option *) 0,
    		(int *)0,
    		0);
    }
    
    
    
    
    int
    getopt_long(int argc, char *const *argv, const char *options,
    const struct option *long_options, int *opt_index)
    {
    	return _getopt_internal(argc, argv, options, long_options, opt_index, 0, 0);
    }
    
    int
    getopt_long_only(int argc, char *const *argv, const char *options,
    const struct option *long_options, int *opt_index)
    {
    	return _getopt_internal(argc, argv, options, long_options, opt_index, 1, 0);
    }
    #endif	/* Not ELIDE_CODE.  */
    
    

    Test getopt

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "getopt.h"
    int main(int argc, char *argv[])
    {
        int opt;
        char *string = "a::b:c:d";
        while ((opt = getopt(argc, argv, string))!= -1)
        {  
            printf("opt = %c\t\t", opt);
            printf("optarg = %s\t\t",optarg);
            printf("optind = %d\t\t",optind);
            printf("argv[optind] = %s\n",argv[optind]);
        }  
    }

    Build and run

    getopt.exe -a100 -b 

    Test getopt_long

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "getopt.h"
    
    static const char *help_str[] = {
        "options:\n",
        "--reset         reset card   \n",
        "--importkey     improt key pair    eg: --importkey \n",
        "--system        load system        eg: --system 123456\n",
        "--user          bind user          eg: --user 123456\n",
        0
    };
    
    enum cmd_type{
        reset = 1,
        importkey,
        system,
        user,
        help
    };
    
    static struct option lopts[] = {
    { "reset",			no_argument,		0, reset },
    { "importkey",   no_argument,        0, importkey },
    { "system",		required_argument,	0, system },
    { "user",		required_argument,	0, user },
    { "help",			no_argument,		0, help},
    { 0, 0, 0, 100 }
    };
    
    static void print_usage()
    {
        int i = 0;
        for( i = 0; help_str[i]; i++ )
            fputs( help_str[i], stdout );
    }
    
    static void parse_opts(int argc, char *argv[])
    {
        char *arg = NULL;
        int c = 0;
        int opt_index = -1;
    
    	printf ("%s[%d] \n", __FUNCTION__, __LINE__);
        while ((c = getopt_long( argc, argv, "h", lopts, &opt_index)) != -1) {
    		printf ("%s[%d] \n", __FUNCTION__, __LINE__);
    
            switch (c) {
            case reset: 
    			fputs( help_str[c], stdout );
                break;
    
            case system:
    			fputs( help_str[c], stdout );
    			break;
    
            case user:
    			fputs( help_str[c], stdout );
    			break;
    
            case importkey: 
    			fputs( help_str[c], stdout );
                break;
    
            case help: {
                print_usage();
                break;
            }
            default:
                print_usage();
                break;
            }
        }
    }
    
    int main (int argc, char *argv[])
    {
    
    	printf ("%s[%d] \n", __FUNCTION__, __LINE__);
        parse_opts (argc, argv);
    	printf ("%s[%d] \n", __FUNCTION__, __LINE__);
    
        return 0;
    }

    Build and run

    getopt_long.exe  -reset --importkey --system 123456

    源码和测试程序也可以点击这里

     

    如果觉得写得不错,烦请微信搜索公众号 "郑州行疆户外" 了解程序员的户外业余喜好。

    展开全文
  • 最近没事的时候,准备研究一下Windows命令行参数的知识,因为每次自己在操作电脑时总是效率太慢,如果能够了解Windows参数的一些知识,绝对能提高效率! 基本外部命令和内部命令 首先是基本的知识,一般Windows...

    最近没事的时候,准备研究一下Windows命令行参数的知识,因为每次自己在操作电脑时总是效率太慢,如果能够了解Windows参数的一些知识,绝对能提高效率!

    基本外部命令和内部命令

    首先是基本的知识,一般Windows命令包含内部命令和外部命令,其中外部命令比较多,外部命令一般在%SystemRoot%\System32里面,我的电脑%SystemRoot%=C:\Windows,估计别人的也差不多。还有一个比较常用的路径%UserProfile%=C:\User\Administrator(或者你自己命名的用户,默认是Administrator),这个路径代表你现在使用的用户路径。 
    内部命令比较少,这里可以罗列出来:

    命令名描述
    assoc 显示或者修改当前的文件扩展关联
    break 设置调试中断
    call 在一个脚本内调用程序或者其他脚本
    cd(chdir) 显示当前目录名或者改变当前目录位置
    cls 清理命令窗口并清除屏幕缓存区
    color 设置命令shell窗口的文本与背景颜色
    copy 将文件从一个位置复制到另一个位置,或者将多个文件连接在一起
    date 显示或者设置系统时间
    del(erase) 删除指定文件、多个文件或目录
    dir 显示当前目录或者指定目录中的子目录与文件列表
    dpath 允许程序打开指定目录中的数据文件(就像在当前目录中一样)
    echo 显示命令行的文本字符串,设置命令回显状态(on|off)
    endlocal 变量局部化结束
    exit 退出命令shell
    for 对一组文件中的每个文件运行指定的命令
    ftype 显示当前文件类型或者修改文件类型(文件扩展关联中使用)
    goto 将命令解释器直接跳转到批处理脚本中某个标记行
    if 命令的条件执行
    md(makedir) 在当前目录或者指定目录下创建子目录
    mklink 为文件或者目录创建符合连接或者硬连接
    move 将一个或者多个文件从当前目录或者指定源目录移动到指定的目标目录,也可以用于对目录进行重命名
    path 显示或者设置操作系统用于搜索可执行文件与脚本的命令路径
    pause 暂停批处理程序,并显示以下消息: 请按任意键继续…
    popd 弹出由pushd保存的目录,使其成为当前目录
    pushd 保存当前目录位置,之后跳转到指定的目录(可选)
    prompt 为命令提示符设置文本
    rd(rmdir) 移除目录(也可以移除其子目录)
    rem 在批处理脚本或者Config.sys中设置标记
    ren(rename) 对一个或者多个文件进行重命名
    set 显示当前环境变量,或者为当前命令shell设置临时变量
    setlocal 在批处理脚本中标记变量局部化的开始
    shift 改变批处理脚本中可替换变量的位置
    start 启动一个单独的窗口,以便运行指定的程序或者命令
    time 显示或者设置系统时间
    title 设置命令shell窗口的标题
    type 显示文本文件的内容
    verify 在将文件写入磁盘后,指令操作系统对其进行验证
    vol 显示磁盘卷标与序列号

    以上就是内部命令,而外部命令太多了,这里就不再罗列,以后用到的时候慢慢记录。 
    首先学习的第一个外部命令是setx,这个命令和内部命令set很像,区别是这个命令可以永久的更改用户环境变量,而set是临时改变,比如我想增加一个 

    C:\script 
    文件夹到path里面,就可以使用: 
    setx Path "%Path;C:\script"或者setx Path "C:\script;%Path" 
    两者的区别是搜索先后顺序不同罢了。

    管理文件扩展与文件关联

    通过使用文件扩展,在命令行只需要输入命令名就可以执行命令,有两种类型的文件扩展: 
    - 可执行文件的文件扩展。可执行文件是使用环境变量%PATHEXT%进行设置的,可以输入set pathext来查看当前设置,一般是PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC,这些文件都不需要在命令行中显示的指定文件扩展名。 
    - 应用程序的文件扩展。应用程序的文件扩展也就是文件关联。通过文件关联可以把参数传递给可执行文件,从而等价于双击鼠标打开对应文件。系统中的已知扩展都对应有文件关联,通过assoc查看,比如assoc.exe即查看后缀为exe文件的文件关联。查询得到.exe=exefile。然后可以使用ftype查看映射的文件类型,比如: ftype exefile得到exefile="%1" %*,即说明运行exe文件时,Windows会判断第一个值为要运行的命令,其他的则为要运行的参数。

    简单脚本编写规则

    有了Windows系统命令的基本知识,就可以写一些简单脚本程序了,与C++、java这类程序有点区别,写脚本程序不需要;来进行断开程序段,在命令读取下面任意字符就终止: 
    - 断行(比如按下shift+enter键) 
    - 回车与断行(比如按下enter键) 
    - 文件尾标志 
    常见语句和命令: 
    cls清除控制台窗口,充值屏幕缓冲 
    rem在脚本中创建注释 
    echo在命令行中显示消息、关闭或者打开命令回显 
    @以行为单位控制命令的回显方式 
    title设置命令shell窗口的标题栏 
    color设置命令shell窗口使用的文本色与背景色

     

    为脚本添加注释

    一般注释信息有: 
    - [ ] 脚本创建时间和最后修改时间 
    - [ ] 脚本创建者 
    - [ ] 脚本创建者联系方式 
    - [ ] 脚本用途 
    - [ ] 脚本输出是否保存及其保存位置 
    例如下面一个简单的脚本程序:

    rem ************************
    rem Script: SysInfo.bat
    rem Creation Data: 2016-7-24
    rem Last Modified: 2016-7-24
    rem Author: XiaoDong Wang
    rem Email: 347916416@qq.com
    rem ************************
    rem Description: Display system configuration information
    rem              include system name. IP configuration 
    rem              and Windows version.
    rem ************************
    rem Files: Stores output in C:\currentSys.txt
    rem ************************ 
    
    @echo off
    hostname > C:\currentSys.txt
    ver >> C:\currentSys.txt
    ipconfig -all >> C:\currentSys.txt

    cls清除控制台窗口,充值屏幕缓冲 
    rem在脚本中创建注释 
    echo在命令行中显示消息、关闭或者打开命令回显 
    @以行为单位控制命令的回显方式 
    title设置命令shell窗口的标题栏 
    color设置命令shell窗口使用的文本色与背景色

    这个程序虽然简单,但是注释的方式值得学习!以后一定要严格要求自己这样注释!!主要上面程序的第一行:@代表后面一句话不显示、echo off代表关闭下面所有行的回显,非常好用,建议所有脚本第一行都加上这句话,是的脚本运行后不用显示一堆无用信息。

     

    1. 1、首先用记事本新建一个文件夹

       

      windows如何编写命令脚本
    2.  

      2、然后在记事本里输入ipconfig /release和ipconfig /renew命令

       

      windows如何编写命令脚本
    3.  

      3、将文本另存为.bat为后缀的文件

       

       

      windows如何编写命令脚本
    4.  

      4、鼠标右键选中编辑好的脚本文件,选择以管理员方式运行

       

      windows如何编写命令脚本
    5. 5

      5、这时我们电脑就会自动断开网络然后重新连接网络了:

       

      windows如何编写命令脚本
    6.  

    我的CMD输入任何命令都显示 不是内部命令也不是外部命令 也不是可运行的外部程序或批处理文件

    兄弟,你电脑的环境变量%path%是不是定义错了?安装少数软件可能会修改path值,建议你重新设置下环境变量。
    具体设置方法:右键“我的电脑”→“属性”→“高级”→”环境变量”
    找到系统变量副框,继续找到path,双击,将变量值输修改成:%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\
    然后再去试试你的命令吧~
    =======================================
    看到你的补充截图,建议你重置一下环境变量:将我给的代码覆盖以前的环境变量设定,当然覆盖前请先备份之前变量路径。

    你命令打错了…………
    要不就是你的系统PATH变量的设置有问题
    你在CMD界面打path命令看一下 有没有类似
    PATH=C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\
    这样的结果的
    如果没有就自己设置一下。

    转载于:https://www.cnblogs.com/zhugeanran/p/9248722.html

    展开全文
  • 5.Windows服务:(以配置mongodb为例: http://www.cnblogs.com/qiernonstop/p/3436454.html )  创建服务 1 C:\Users\Administrator>D: 2 3 D:\>CD D:\Program Files\mongodb\bin 4 5 D:\...

    这里先讲一下系统变量:

    注意:一旦将路径加入到环境变量Path中,那么运行它下面的程序的时候就不用非得指定到目标路径中,直接键入命令就行了。

     

    1.type命令:打开并读取文件里面的内容。

    1 C:\Users\Administrator>type C:\Users\Administrator\Desktop\css\style.css

    2.dir命令:列出路径目录结构。

    1 C:\Users\Administrator>dir

    3.mkdir命令:创建文件夹。

    1 C:\Users\Administrator>mkdir data

    4.“D:”or“E:”命令:转到其他卷标。

    1 C:\Users\Administrator>D:

      CD命令:定位到同一卷标的其他路径。

    1 D:\>CD D:\Program Files\mongodb\bin
    2 
    3 D:\Program Files\mongodb\bin>

      “CD ..”与“CD ../..”命令:向前定位。

    1 D:\Program Files\mongodb\bin>CD ..
    2 
    3 D:\Program Files\mongodb>CD ../..
    4 
    5 D:\>

    5.Windows服务:(以配置mongodb为例:http://www.cnblogs.com/qiernonstop/p/3436454.html

      创建服务

    1 C:\Users\Administrator>D:
    2 
    3 D:\>CD D:\Program Files\mongodb\bin
    4 
    5 D:\Program Files\mongodb\bin>mongod --install --serviceName MongoDB --serviceDis
    6 playName MongoDB --logpath "D:\Program Files\mongodb\data\log\MongoDB.log" --dbp
    7 ath "D:\Program Files\mongodb\data\db" --directoryperdb

      启动服务(在运行里直接输入 services.msc 也可以打开服务选项

    1 C:\Users\Administrator>net start MongoDB

      停止服务

    1 C:\Users\Administrator>net stop mongodb  

      删除服务

    1 C:\Users\Administrator>sc delete MongoDB

     

     

     

     

    转载于:https://www.cnblogs.com/qiernonstop/p/3436513.html

    展开全文
  • 而当在命令行参数中: 提交的参数是 %cd% 时参数是当前路径 使用批处理类似的方法 参数是 %%cd%% 时并无法将参数变为 %cd% 而是 %路径% 在命令行中如何传递字符串才能使得到的参数为%cd%本身?
  • #列出所有进程信息 CMD>wmic process   #列出所有java...但这种情况正在不断改观,Windows命令行也越来越强大了。其中,微软耗费大量精力打造的wmi就是一例。而wmic就是几句wmi的命令行工具。

    #列出所有进程信息

    CMD>wmic process

     

    #列出所有java进程

    CMD>wmic process where caption="java.exe"

     

    注:Windows最令网管诟病的地方就是命令行没有Unix和Linux强大。但这种情况正在不断改观,Windows命令行也越来越强大了。其中,微软耗费大量精力打造的wmi就是一例。而wmic就是几句wmi的命令行工具。

    展开全文
  •  Windows命令行参数的转义分为两个步骤,第一个步骤是cmd解析你输入的字符串决定要启动哪些进程,进程之间是否要标准输入输出重定向等等;第二个步骤是CRT把传入进程的命令行字符串切成多个参数,填好argc和argv传入...
  • 使用 Windows 终端的命令行参数Using command-line arguments for Windows Terminal06/18/2020本文内容可以使用 wt.exe 从命令行打开 Windows 终端的新实例。You can use wt.exe to open a new instance of Windows ...
  • 前一阵子翻 Linux 内核代码的时候看到了内核对模块参数 (moduleparam) 的处理,觉得挺精妙,让我不禁想研究下 C 下的命令行参数要怎样更好地处理。本文所用代码都在这里 aparsing 。代码支持在 Windows 、 Linux 、 ...
  • 功能:C++命令行参数解析类。(控制台应用程序中使用)在 Windows 平台下使用 Linux 的 getopt, getopt_long, getopt_long_only 函数。压缩包内包含getopt.h,getopt.c和使用代码示例。在VS2010下编译通过,运行良好...
  • 现在,一切正常,但如果我尝试向shell脚本提供命令行参数,脚本将无法执行.工作 – >前C:\temp\Testing>putty.exe -pw “blabla” -m “test-script.sh”bob@10.20.110.57但是,如果我试图提供参数,它就无法执行....
  • Windows命令行参数的转义(dos/cmd.exe下输入双引号竖扛等特殊字符) 解决办法: 传入base64编码的字符串,然后在Qt程序中反编码一下。 这样的话,解析的json字符串就不会有问题了。 参考: Qt之Base64编解码 Windows...
  • 如果我尝试直接将它们作为可执行命令从Windows命令shell执行,那么我无法将命令行参数传递给Python程序。例如,如果我有这个程序(test.py):import sysprint "Args: %r" % sys.argv[1:]并执行:>test fooArgs: []...
  • 摘要:VC/C++源码,系统相关,应用程序,命令行 处理Windows应用程序的命令行参数,文件名:MyCommandLineInfo.cpp CMyCommandLineInfo类的实现文件,显示对话框B(应用程序命令行参数演示)。  // stdafx.h : 标准...
  • 两中方法: 第一种: 1 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow){ 2 int argc = 0; ... 3 LPWSTR *argv= NULL;... 4 //分割命令行参数 ...
  • 命令行参数

    千次阅读 2018-06-03 12:00:21
    以命令行方式运行程序: 举例: 第一步:按住windows键和R键,... 结果如下:命令行参数:用户在CMD窗口用输入可执行文件名的方式启动程序时,跟在可执行文件名后面的那些字符串,称为“命令行参数”。命令行参数...
  • 我们通常得到的命令行参数是一个字符串数组 string[] args,以至于很多的命令行解析库也是使用...在 Windows 系统中有函数 CommandLineToArgvW 可以直接将一个字符串转换为命令行参数数组,我们可以直接使用这个函...
  • 如何在某个文件夹打开命令行窗口,并运行其中的文件 1.我们先进入到该文件夹 2.然后在地址栏键入cmd,再回车就可以进入命令栏 3.我们已在文件夹里生成了一个Project5.exe的文件 /*Project5.exe*/ #include<...
  • C语言命令行参数的使用 测试代码 #include <stdio.h> void main(int argc,char** argv) { printf("%d\n",argc); printf("%s\n",argv[0]); printf("%s\n",argv[1]); printf("%s\n",argv[2]); } 参数说明 ...
  • Windows 资源管理器命令行参数

    千次阅读 2008-11-07 09:00:00
    Windows 资源管理器命令行参数关键词: explorer 参数 资源管理器 概要本分步指南介绍了如何在 Windows XP 中使用 Windows 资源管理器命令行参数。 更多信息使用命令行参数,您既可以自定义 Windows 资源管理器...
  • windows命令行

    2016-08-30 16:30:39
    一种为从命令行输入参数,批处理参数扩展变量(%0 到 %9)。当在批处理文件中使用批处理参数时,%0 将由批处理文件名替换,而 %1 到 %9 将由在命令行键入的相应参数替换。 另一种为键盘输入参数,合用set /p完成,...
  • Windows上WinRAR.exe命令行参数说明winrar.exe命令行参数[语法]RAR<命令>[-<开关>]<压缩文件>[列表文件...>]RAR[<文件...>][<解压路径/>]一.简单的例子和说明:压缩文件夹winrar....
  • windows 命令行获取进程参数

    千次阅读 2014-12-01 13:57:14
    wmic process where name="QQ.exe" get CommandLine
  • 前言在命令行运行过程序的同学应该对命令的附加参数不陌生,比如我们在windows下的命令窗口中输入help rename,则它的显示如下:其输出说明了rename这个命令的用法,如果你仔细观察就会发现,它后面带的参数不止一个...
  • Windows上通过命令行参数限制CPU

    千次阅读 2018-02-04 15:24:47
    start /WAIT /affinity 0x1 app.exe (只使用第一个CPU) start /WAIT /affinity 0x2 app.exe (只使用第二个CPU) ...上面命令中 “/WAIT” 参数是用来指定运行应用程序时等待应用程序退出,而不是在后台运行。
  • Windows API一日一练 3 使用命令行参数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,594
精华内容 1,437
关键字:

windows命令行参数