Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Environment.ExpandEnvironmentVariables不适用于所有变量_C#_Cmd_Environment - Fatal编程技术网

C# Environment.ExpandEnvironmentVariables不适用于所有变量

C# Environment.ExpandEnvironmentVariables不适用于所有变量,c#,cmd,environment,C#,Cmd,Environment,我注意到,该方法Environment.ExpandEnvironmentVariables()不会返回某些系统变量的值,例如%date%、%time%、%homeshare%等。。。为什么?%HOMESHARE%可能只是未定义(并非在所有情况下都定义)%DATE%和%TIME%是AFAIK在CMD之外不可用的动态变量(例如%CD%和%ERRORLEVEL%也是如此)。当然是正确的,我认为我为以下函数提供了代码,该函数试图替换(一些)以及CMD.EXE特定变量 public static

我注意到,该方法
Environment.ExpandEnvironmentVariables()
不会返回某些系统变量的值,例如
%date%
%time%
%homeshare%
等。。。为什么?

%HOMESHARE%
可能只是未定义(并非在所有情况下都定义)
%DATE%
%TIME%
是AFAIK在
CMD
之外不可用的动态变量(例如
%CD%
%ERRORLEVEL%
也是如此)。

当然是正确的,我认为我为以下函数提供了代码,该函数试图替换(一些)以及
CMD.EXE
特定变量

    public static string ExpandEnvironmentVariables(string str)
    {
        // Environment.ExpandEnvironmentVariables() does this as well, but we don't rely on that.
        if (str == null)
            throw new ArgumentNullException("str");

        // First let .NET Fx version do its thing, because then:
        //
        // - Permission checks, etc. will already be done up front.
        // - Should %CD% already exists as a user defined variable, it will already be replaced,
        //   and we don't do it by the CurrentDirectory later on. This behavior is consistent with
        //   what CMD.EXE does.
        //   Also see http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx.
        //  
        str = Environment.ExpandEnvironmentVariables(str);

        // The following is rather expensive, so a quick check if anything *could* be required at all
        // seems to be warrented.
        if (str.IndexOf('%') != -1)
        {
            const StringComparison comp = StringComparison.OrdinalIgnoreCase;
            var invariantCulture = CultureInfo.InvariantCulture;
            var now = DateTime.Now;

            str = str.Replace("%CD%", Environment.CurrentDirectory, comp);
            str = str.Replace("%TIME%", now.ToString("T") + "," + now.ToString("ff"), comp);
            str = str.Replace("%DATE%", now.ToString("d"), comp);
            str = str.Replace("%RANDOM%", s_random.Next(0, Int16.MaxValue).ToString(invariantCulture), comp);

            // Debatable, but we replace them anyway to make sure callers don't "crash" because
            // them not being unexpanded, and becase we "can".

            str = str.Replace("%CMDEXTVERSION%", "2", comp); // This is true at least on XP to Server 2008R2
            str = str.Replace("%CMDCMDLINE%", Environment.CommandLine, comp);

            uint nodeNumber;
            if (!NativeMethods.GetNumaHighestNodeNumber(out nodeNumber))
            {
                nodeNumber = 0;
            }

            str = str.Replace("%HIGHESTNUMANODENUMBER%", nodeNumber.ToString(invariantCulture), comp);
        }

        return str;
    }
GetNumaHighestNodeNumber
p/Invoke的定义如下:

    [DllImport(KernelDll)]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    public static extern bool GetNumaHighestNodeNumber([Out] out uint   HighestNodeNumber);

+1:当我们这样做的时候,
%RANDOM%
%HIGHESTNUMANODENUMBER%
%CMDEXTVERSION%
%cmdline%
也是一样的,尽管后面的那些似乎很明显;-)