为什么访问C:\windows\System32\的windows命令。。。不在C程序中工作?

为什么访问C:\windows\System32\的windows命令。。。不在C程序中工作?,c,windows,cmd,system32,bcdedit,C,Windows,Cmd,System32,Bcdedit,我正在运行一个c程序,该程序旨在自动执行“重新打包”windows安装的过程。我这样做有两个原因。第一个原因是学习c编程,第二个原因是我在没有superdrive的MacBookPro上运行windows。我找到了一个教程,解释了如何在vbox上安装windows,然后将其复制到另一个硬盘上。我决定练习c编程并使本教程自动化,因此我编写了下面的代码。当我运行下面的程序时,会出现错误,bcdedit不是一个内部或外部命令,unattend.xml会复制,但当我检查它是否存在时,就找不到了。经过一点

我正在运行一个c程序,该程序旨在自动执行“重新打包”windows安装的过程。我这样做有两个原因。第一个原因是学习c编程,第二个原因是我在没有superdrive的MacBookPro上运行windows。我找到了一个教程,解释了如何在vbox上安装windows,然后将其复制到另一个硬盘上。我决定练习c编程并使本教程自动化,因此我编写了下面的代码。当我运行下面的程序时,会出现错误,bcdedit不是一个内部或外部命令,unattend.xml会复制,但当我检查它是否存在时,就找不到了。经过一点实验后,我发现,如果直接从提升的命令提示符下运行,我在System()函数中使用的代码运行得非常好。尽管它给了我前面提到的错误,当我从提升的命令提示符运行我的程序时。exe似乎无法访问System32文件夹??请帮忙!我在这里把头撞在墙上

    #include <stdio.h>

    void part1 (void);
    void part2 (void);

    void part1 (void)
    {
        FILE *fp;
        //Run Switcheroo
        if ((fp=fopen("log.txt", "r")) == NULL)
        {
            //Run part 1.
            system("DISKPART /s resources\\diskpart\\DskPrtAssgn.txt");
            system("TIMEOUT /T 3");
            system("reg unload HKLM\\BCD00000000");
            system("TIMEOUT /T 3");
            system("robocopy s:\\ c:\\ bootmgr");
            system("TIMEOUT /T 3");
            system("robocopy s:\\Boot c:\\Boot /s");
            system("TIMEOUT /T 3");
            system("bcdedit /store c:\\boot\\bcd /set {bootmgr} device partition=C:");
            system("TIMEOUT /T 3");
            system("DISKPART /s resources\\diskpart\\DskPrtActv.txt");
            system("TIMEOUT /T 3");
            system("schtasks /create /tn 'Switcheroo' /tr %userprofile%\\Desktop\\Switcheroo\\Switcheroo.exe /sc onlogon");

            //Set up the log file that the computer will check upon reboot.
            char buffer[2] = {'0'};
            fp = fopen("log.txt", "wb");
            fwrite (buffer , 1 , sizeof(buffer) , fp );

            //Reboot.
            system("shutdown -r");
        }
        else if (fp = fopen("log.txt", "rt"))
        {
            part2();
        }
    }

    void part2 (void)
    {
        FILE *fp;

        //Read the log file from part1. 
        if (fp = fopen("log.txt", "rt"))
        {
            //Run part 2.
            system("DISKPART /s resources\\diskpart\\DskPrtRmv.txt");
            system("TIMEOUT /T 3");
            system("cd resources\\sysprep");
            system("copy unattend.xml C:\Windows\System32\Sysprep");
            system("TIMEOUT /T 3");     
            system("runas /user:%username% %userprofile%\\Desktop\\Switcheroo\\resources\\sysprep\\ sysprep.bat");
        }

        //If part one did not finish then print error.
        else if ((fp=fopen("log.txt", "r")) == NULL)
        {
            printf("Error.");
        }
    }

    int main ()
    {
        part1();
        return(0);
    }
#包括
无效部分1(无效);
无效部分2(无效);
无效部分1(无效)
{
文件*fp;
//运行Switcheroo
if((fp=fopen(“log.txt”,“r”))==NULL)
{
//运行第1部分。
系统(“DISKPART/s资源\\DISKPART\\dskptassgn.txt”);
系统(“超时/t3”);
系统(“reg unload HKLM\\BCD00000000”);
系统(“超时/t3”);
系统(“robocopy s:\\c:\\bootmgr”);
系统(“超时/t3”);
系统(“robocopy s:\\Boot c:\\Boot/s”);
系统(“超时/t3”);
系统(“bcdedit/store c:\\boot\\bcd/set{bootmgr}设备分区=c:”;
系统(“超时/t3”);
系统(“DISKPART/s资源\\DISKPART\\dskptacTV.txt”);
系统(“超时/t3”);
系统(“schtasks/create/tn'Switcheroo'/tr%userprofile%\\Desktop\\Switcheroo\\Switcheroo.exe/sc onlogon”);
//设置重新启动时计算机将检查的日志文件。
字符缓冲区[2]={0'};
fp=fopen(“log.txt”、“wb”);
fwrite(缓冲区,1,sizeof(缓冲区),fp);
//重新启动。
系统(“关闭-r”);
}
else if(fp=fopen(“log.txt”、“rt”))
{
第2部分();
}
}
无效部分2(无效)
{
文件*fp;
//从第1部分读取日志文件。
如果(fp=fopen(“log.txt”、“rt”))
{
//运行第2部分。
系统(“DISKPART/s资源\\DISKPART\\DskPrtRmv.txt”);
系统(“超时/t3”);
系统(“cd资源\\sysprep”);
系统(“copy unattend.xml C:\Windows\System32\Sysprep”);
系统(“超时/t3”);
系统(“运行方式/用户:%username%%userprofile%\\Desktop\\switchero\\resources\\sysprep\\sysprep.bat”);
}
//如果第一部分未完成,则打印错误。
else if((fp=fopen(“log.txt”,“r”))==NULL)
{
printf(“错误”);
}
}
int main()
{
第1部分();
返回(0);
}

您是否在编译时关闭了所有警告

因为行
系统(“copy unattend.xml C:\Windows\System32\Sysprep”)
需要避开反斜杠

编辑


当您被拒绝访问该文件夹时,这将是一个权限问题。如果您以管理员身份运行.exe,它应该可以工作

您是否在编译时关闭了所有警告

因为行
系统(“copy unattend.xml C:\Windows\System32\Sysprep”)
需要避开反斜杠

编辑


当您被拒绝访问该文件夹时,这将是一个权限问题。如果您以管理员身份运行.exe,它应该可以工作

您不应该使用C编写系统管理脚本。请使用批处理、python或PowerShell编写。对于您正在编写的程序,C绝对不是正确的选择。

您不应该使用C编写系统管理脚本。请使用批处理、python或PowerShell编写。对于您正在编写的程序,C绝对不是正确的选择。

我不能肯定这是您的问题,但是。。。我怀疑您有
system()
调用,只是
cd
到一个新目录。由于每一个都在新的shell中运行,因此不会影响对
system()
的后续调用。因此,如果您试图更改到存在文件的目录以对其进行操作,您将发现您实际上不在该目录中。

我不能肯定这是您的问题,但是。。。我怀疑您有
system()
调用,只是
cd
到一个新目录。由于每一个都在新的shell中运行,因此不会影响对
system()
的后续调用。因此,如果您试图更改到存在文件的目录以对其进行操作,您将发现您实际上不在该目录中。

您已跳过每行中的所有反斜杠,但失败的一行除外。你只需要在那里逃离他们

system("copy unattend.xml C:\\Windows\\System32\\Sysprep"); 
我不得不承认你所做的对于C程序来说是疯狂的。但它应该起作用

编辑

在上一次System()调用中,
sysprep.bat
之前似乎还有一个不需要的空格

另外,我同意FatalError的说法,您的
cd
系统调用没有任何好处。删除该行,然后在“unattend.xml”前面加上下一行中文件的完整路径


如果在任何默认路径文件夹中都找不到bcedit,则可能需要提供文件的绝对路径。

您已跳过每行中的所有反斜杠,但失败的一行除外。你只需要在那里逃离他们

system("copy unattend.xml C:\\Windows\\System32\\Sysprep"); 
我不得不同意