在第一次循环迭代时创建新文件时访问路径被拒绝

时间:2013-08-27 17:07:46

标签: file loops powershell path denied

将数据写入新文件时遇到一个奇怪的问题。我有一个目录中的文件列表,其中包含我正在使用Create-VMwareconf()函数解析和返回数据的数据。这将返回我已分配给$ t的哈希表中的数据。我从$ t函数中提取了所需的文件夹和文件名,但是每次开始循环时,我都会在初始文件夹创建时遇到以下错误,第二次和第三次正常工作。有趣的是,应该在第一个文件中的数据存在于第二个文件夹中。

如果我再次运行脚本,它会生成所有三个对象,但与文件名匹配的文件中的数据序列不正确。

如何停止以下错误,将不胜感激;

$e = (Get-Childitem ".\a\*\*.ini")
Set-Location "C:\WindowsRoot\vmwareconfigfiles\"
ForEach($d in $e){
$vmwaredirectory = New-item -type directory -path .\ -name $dd -Force
$vmwarefile = New-Item -type file -path $vmwaredirectory -name $dd -Force
$t = Create-VMwareconf($d)
$dd = $t.Value["0"]

#Write contents to new file
$t | Out-File $vmwarefile
}

初次运行时收到错误;

New-Item:拒绝访问路径'C:\ WindowsRoot \ vmwareconfigfiles'。  在C:\ WindowsRoot \ parsedisrec.ps1:93 char:15  + $ vmwarefile = New-Item -type file -path $ vmwaredirectory -name $ dd -Force  + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~      + CategoryInfo:PermissionDenied:(C:\ WindowsRoot \ vmwareconfigfiles:String)[New-Item],UnauthorizedAccessException      + FullyQualifiedErrorId:NewItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.NewItemCommand

Out-File:无法将参数绑定到参数'FilePath',因为它为null。 在C:\ WindowsRoot \ parsedisrec.ps1:97 char:15 + $ t | Out-File $ vmwarefile + ~~~~~~~~~~~     + CategoryInfo:InvalidData :( :) [Out-File],ParameterBindingValidationException     + FullyQualifiedErrorId:ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.OutFileCommand

1 个答案:

答案 0 :(得分:1)

New-Item -Type file在第一次迭代期间失败,因为$dd尚未初始化,因此您尝试创建一个与当前目录同名的文件。如果您使用$null(或甚至.)作为名称,则会得到相同的结果:

PS C:\> New-Item -Type file -Path 'C:\some\where' -Name $null -Force
New-Item : Access to the path 'C:\some\where' is denied.
At line:1 char:1
+ New-Item -Type file -Path 'C:\some\where' -Name $null -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\some\where:String) [New-Item], UnauthorizedAccessException
    + FullyQualifiedErrorId : NewItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.NewItemCommand

PS C:\> New-Item -Type file -Path 'C:\some\where' -Name '.' -Force
New-Item : Access to the path 'C:\some\where' is denied.
At line:1 char:1
+ New-Item -Type file -Path 'C:\some\where' -name '.' -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\some\where\.:String) [New-Item], UnauthorizedAccessException
    + FullyQualifiedErrorId : NewItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.NewItemCommand

改变这个:

ForEach($d in $e){
  $vmwaredirectory = New-item -type directory -path .\ -name $dd -Force
  $vmwarefile = New-Item -type file -path $vmwaredirectory -name $dd -Force
  $t = Create-VMwareconf($d)
  $dd = $t.Value["0"]

进入这个:

ForEach($d in $e){
  $t = Create-VMwareconf($d)
  $dd = $t.Value["0"]
  $vmwaredirectory = New-item -type directory -path .\ -name $dd -Force
  $vmwarefile = New-Item -type file -path $vmwaredirectory -name $dd -Force