我有一个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");
}
}
}
答案 0 :(得分:4)
您正在测试的计算机上的操作系统架构是什么?
编译C
程序时,你的目标是32位还是64位exe?
您的操作系统是64位且程序是32位这样的事实可以解释您的麻烦,因此它会执行32位版本的PowerShell,这会产生一些麻烦。
如果是这样,你可以解决从32位C exe使用64位PowerShell生成的问题。
c:\windows\sysnative\WindowsPowerShell\v1.0\powershell.exe