Powershell无法找到文件

时间:2015-07-28 07:29:38

标签: powershell legacy

请考虑以下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控制台中运行时,该命令的行为与预期的一样。

是否有任何可编写脚本的方法来解决此问题?

2 个答案:

答案 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