请考虑以下PowerShell代码:
IF(Test-Path -Path "C:\Windows\System32\File123")
{Remove-Item -Force -Path "C:\Windows\System32\File123"}
如果代码是在x86 PowerShell控制台中执行的,则会引发以下错误:Get-ChildItem:找不到路径' C:\ Windows \ System32 \ File123'因为它不存在。
但是,当代码在x64 Powershell控制台中运行时,该命令的行为与预期的一样。
是否有任何可编写脚本的方法来解决此问题?
答案 0 :(得分:2)
hacky 解决方法是检测脚本是否使用PowerShell x86运行,并通过将此代码段放在脚本的开头,使用x64 PowerShell调用它:
if ($env:Processor_Architecture -eq "x86")
{
&"$env:windir\sysnative\WindowsPowerShell\v1.0\powershell.exe" -noprofile -file $myinvocation.Mycommand.path -executionpolicy bypass
exit
}
答案 1 :(得分:0)
感谢您的回复,我有时间做一些搜索,并提出以下建议。我正在使用Powershell v4。您可以在ps64别名之后放置任何内容,例如脚本或函数。别名的信用转到this page。还要感谢[ScriptBlock]::Create("")
提示https://stackoverflow.com/a/19835164/4317867,在执行此操作之前,脚本块不会正确扩展$ server。
这样做的目的是删除Powershell的计划任务/作业文件,以允许重新创建它。
Param(
[Parameter(Mandatory=$true,
HelpMessage="ServerName goes here")]
[string]$server,
[Parameter(Mandatory=$true,
HelpMessage="Enter a Date/Time 07-28-15 16:00 For July 28th, 2015 at 4:00 PM")]
[ValidatePattern('\d{2}-\d{2}-\d{2}\s\d{2}[:]\d{2}')]
$date)
if($env:PROCESSOR_ARCHITECTURE -eq "x86")
{
set-alias ps64 "$env:windir\sysnative\WindowsPowerShell\v1.0\powershell.exe"
ps64 -command "IF(Test-Path -Path C:\Windows\System32\Tasks\Microsoft\Windows\PowerShell\ScheduledJobs\RebootOnce2){Remove-Item -Force -Path C:\Windows\System32\Tasks\Microsoft\Windows\PowerShell\ScheduledJobs\RebootOnce2}" #End 64 bit powershell.
}
Else{
Get-ScheduledJob | Unregister-ScheduledJob
}
$user = Get-Credential -UserName $env:USERNAME -Message "UserName/password for scheduled Reboot"
$trigger = New-JobTrigger -once -at $date
$script = [ScriptBlock]::Create("D:\Scripts\Scheduled-Reboot-Single.ps1 -server $server | Out-File -Force \\LogServer\d$\scripts\$server-Reboot.log")
Register-ScheduledJob -Name RebootOnce2 -Credential $user -Trigger $trigger -ScriptBlock $script