如果从c程序执行,Powershell脚本不起作用?

时间:2012-06-03 05:46:24

标签: c powershell

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

POWERSHELL SCRIPT:

#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");
        }
    }
}

1 个答案:

答案 0 :(得分:4)

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

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

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

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

c:\windows\sysnative\WindowsPowerShell\v1.0\powershell.exe