2012-07-10 26 views
1

我想要做的是利用开放文件对话框,选择一个ini文件,并使用set-content在该脚本的末尾对其进行行更改。但是我不断收到Set-Content的错误:进程无法访问该文件,并且它正在使用中。Powershell:打开文件对话框和设置内容问题。无法访问文件。在使用

$a = $env:userprofile 
Function Get-FileName($InitialDirectory) 
{ 
Get-FileName -InitialDirectory "$a\AppData\Roaming\Milliman" 
}#end function Get-FileName 

[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null 
$dialog = New-Object System.Windows.Forms.OpenFileDialog 
$dialog.DefaultExt = '.*' 
$dialog.Filter = 'All Files|*.*' 
$dialog.FilterIndex = 0 
$dialog.InitialDirectory = $InitialDirectory 
$dialog.Multiselect = $false 
$dialog.RestoreDirectory = $true 
$dialog.Title = "Select a file" 
$dialog.ValidateNames = $true 
$dialog.ShowHelp = $true 
$dialog.ShowDialog() 
$dialog.FileName 


##Folder Dialog 
$dir = new-object -com Shell.Application 
$aldir = $dir.BrowseForFolder(0, "AL Dir", 0, "C:\Program Files\Milliman\") 
if ($aldir.Self.Path -ne "") {write-host "You selected " $aldir.Self.Path} 


## Grid Integration Steps 

Copy-Item -path "\\ap102aric\alfaadmin$\Ver70andAbove\DataSynapse\*" -destination "C:\Program  Files\Common Files\Milliman\MG-ALFA Shared\DataSynapse" -Force 

Copy-Item -path "\\ap102aric\alfaadmin$\Ver70andAbove\JobOptions-RPRic\*" -destination "C:\Program Files\Common Files\Milliman\MG-ALFA Shared\DataSynapse" -Force 

Copy-Item -path "\\ap102aric\alfaadmin$\Ver70andAbove\GSDLL\dsdrv.dll" -Destination $aldir.Self.Path -Force 


## Set Environment Variable 
[Environment]::SetEnvironmentVariable("DSDRIVER_DIR","C:\Program Files\Common Files\Milliman\MG-ALFA Shared\DataSynapse\Config","Machine") 

## Edit Config UI.ini to set SDP LOGON for Datasynapse 
#Write-Host $dialog.FileName 
Get-Content $dialog.FileName | ForEach-Object { 
$_ -replace 'SDPAvailable=*','SDPAvailable=DataSynapse' 
    -replace 'SDPFolder=*','SDPFolder=C:\Program Files\Common Files\Milliman\MG-ALFA Shared\DataSynapse' 
    -replace 'SDPLogon=*','SDPAvailable=Yes' 
} | Set-Content $dialog.FileName 

回答

0

尝试销毁$aldir对象。它可能持有该文件的句柄。我不知道该怎么做。在获取用户选择的路径后,可能将其设置为$ null。

您也可以尝试使用Process Monitor来确定哪个进程正在锁定文件。

最后,您不能将输出从Get-Content输出到Set-Content,例如,

Get-Content $Path | Set-Content $Path 

项目会立即派人下来PowerShell管道,所以当Get-Content读取一行时,它立即被设置为Set-Content,这将无法工作,因为Get-Content打开了该文件。请尝试保存文件的内容:

$file = Get-Content $path 
# Modify $file 
$file | Set-Content $path