好的,所以我确定之前已经问过这个问题,但我似乎无法正确地说出问题以获得任何答案。
我尝试做的是通过c#启动应用程序,然后让所有对SHGetFolderPath
或Environment.GetFolder
(int .net)的调用返回备用路径我指定的。
我尝试使用USERPROFILE
作为示例将ProcessStartInfo.EnvironmentalVariables
设置为某个任意目录,但它没有用。它将环境变量USERPROFILE
设置为正确的值,但调用SHGetFolderPath
或Environment.GetFolder
仍会返回先前的值。
关于我如何能够在那里获得全部方式的任何想法?
这是我为此编写的测试应用
class Program
{
static void Main(string[] args)
{
if (args.Any(x => x.Contains("x")))
{
// Read vars
Console.WriteLine("a=" + Environment.GetEnvironmentVariable("a"));// a=tacos
Console.WriteLine("USERPROFILE=" + Environment.GetEnvironmentVariable("USERPROFILE")); //USERPROFILE=F:\UP
Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)); // C:\Users\Username
Console.WriteLine();
var allvars = Environment.GetEnvironmentVariables();
foreach (var key in allvars.Keys)
{
Console.WriteLine("{0} - {1}", key, allvars[key]);
}
Console.WriteLine("Done Second Process");
}
else
{
// Start new process
var proc = new System.Diagnostics.ProcessStartInfo(Assembly.GetEntryAssembly().Location);
proc.Arguments = "x";
proc.EnvironmentVariables["a"] = "tacos";
proc.EnvironmentVariables["USERPROFILE"] = @"F:\UP";
proc.UseShellExecute = false;
proc.RedirectStandardInput = true;
proc.RedirectStandardOutput = true;
proc.RedirectStandardError = true;
var p = Process.Start(proc);
do
{
Thread.Sleep(10);
Console.Out.Write(p.StandardOutput.ReadToEnd());
}
while (!p.HasExited);
//catch any leftovers in redirected stdout
Console.Out.Write(p.StandardOutput.ReadToEnd());
Console.WriteLine("Any Key");
Console.ReadKey();
Console.WriteLine("Exiting...");
}
}
}
答案 0 :(得分:2)
据我所知,Windows不是为chroot风格的行为而设计的。你得到的最接近的是文件系统虚拟化,但是a)与SHGetFolderPath
无关,而b)是在不考虑通用性的情况下实现的。所以我不认为你真正想要的是什么。