4

如果我从管理员 powershell 运行它,我有一个 powershell 脚本可以正常工作。但是,如果我在 ac 程序中调用 powershell 脚本,以管理员身份运行,使用 system() 函数,它的某些部分不起作用。更具体地说,复制 unattend.xml 和 sysprep.exe 命令。我已经发布了 powershell 脚本和 c 程序脚本。我怎样才能让它工作?

POWERSHELL 脚本:

#Set working directory to scripts location.
$scriptpath = $MyInvocation.MyCommand.Path
$Switcheroo = Split-Path $scriptpath
Set-Location $Switcheroo
#Set error options
$Error.clear()
$ErrorActionPreference = “Inquire”

Write-Host "Running part 2."
#1
& "DISKPART" /s $Switcheroo\DskPrtRmv.txt
TIMEOUT /T 3

#2
if ($? -eq "True")
{
    Copy-Item $Switcheroo\unattend.xml $env:windir\System32\Sysprep
    TIMEOUT /T 3 

    #3
    if ($? -eq "True")
    {
        SCHTASKS /Delete /TN "Switcheroo" /f
        TIMEOUT /T 3
    }
    elseif ($? -ne "True")
    {
        Write-Host Failed to copy unattend.xml
        exit (22)
    }

        #4
        if ($? -eq "True")
        {
            rm log.txt
            TIMEOUT /T 3
        }
        elseif ($? -ne "True")
        {
            Write-Host Failed to delete the schedued task
            exit (32)
        }

            #5
            if ($? -eq "True")
            {
                & "$env:windir\System32\Sysprep\sysprep.exe" /generalize /oobe /shutdown /unattend:unattend.xml
            }
            elseif ($? -ne "True")
            {
                Write-Host Failed to remove the log.txt
                exit (42)
            }
                #6
                if ($? -ne "True")
                {
                    Write-Host Sysprep failed.
                    exit (52)
                }
}
elseif ($? -ne "True")
{
    Write-Host Failed to run DskPrtRmv
    exit (12)
}

C代码:

/* 
* File:   main.c
* Author: Andrew
*
* Created on June 1, 2012, 2:39 PM
*/

#include <stdio.h>
#include <stdlib.h>

FILE *fp;

int main() 
{
    printf("Switcheroo in progress...\n");

    if ((fp=fopen("chk.bin", "rb")) == NULL)
    {
        //Run powershell script Part1.ps1 and set its return value to the int i variable.
        int i = system("powershell -executionpolicy unrestricted -file \"Part1.ps1\"");
        if (i == 0)
        {
            //Set up the log file that the computer will check upon reboot.
            char buffer[2] = {'0'};
            fp = fopen("chk.bin", "wb");
            fwrite (buffer , 1 , sizeof(buffer) , fp );
        }
        else if (i != 0)
        {
            //Print the error returned from powershell script Part1.ps1
            printf("Part1 Error: %d \n", i);
            system("PAUSE");
        }
    }
    else if (fp = fopen("chk.bin", "rb"))
    {
        //Run powershell script Part2.ps1 and set its return value to the int j variable.
        int j = system("powershell -executionpolicy unrestricted -file \"Part2.ps1\"");
        if (j == 0)
        {
            printf("Switcheroo has finished successfully.\n");
            remove("chk.bin");
        }
        else if (j != 0)
        {
            //Print the error returned from powershell script Part2.ps1
            printf("Part2 Error: %d \n", j);
            system("PAUSE");
        }
    }
}
4

1 回答 1

4

您正在测试的计算机上的操作系统架构是什么?

当你编译你的C程序时,你的目标是 32 位还是 64 位 exe?

您的问题可以通过您的操作系统是 64 位而您的程序是 32 位这一事实来解释,因此它执行 32 位版本的 PowerShell,这会产生一些麻烦。

如果是这样,您可以使用从 32 位 C exe 生成 64 位 PowerShell 来解决您的问题。

c:\windows\sysnative\WindowsPowerShell\v1.0\powershell.exe
于 2012-06-03T07:02:36.937 回答