如何使用PowerShell以只读方式打开SolidWorks sldprt文件



我在PowerShell中为我编写的GUI构建了这个打开文件的函数,该函数允许您在服务器上查找和打开各种文件。我主要使用它以只读方式打开SolidWorks文件,但也用于PDF文件,如果有文件关联,它应该适用于任何其他文件。

问题是,有时打开sldprt文件时它不起作用。SolidWorks将忽略打开文件的请求,或者它不会以只读方式打开。我认为这主要只是一个solidworks问题,因为有时从windows资源管理器双击时它不会打开文件。

无论如何,我的解决方案是将文件属性设置为只读。启动一个在SolidWorks中打开文件的作业,然后等待SolidWorks进程空闲,然后删除只读属性。它通过一个监视作业状态更改的事件来执行此操作。由于这是通过GUI运行的,因此必须在后台进行,以防止GUI锁定。

有没有一种更简单的方法可以用PowerShell以只读方式打开文件?

我认为使用SolidWorks.dll文件是可能的,但它们是用C#或VB脚本加载的,我不知道我在用这两种语言做什么。

function open-File{
param(
[parameter(Mandatory=$true)]$file,
[bool]$readOnly = $true,
$processName=$null
)
[scriptblock]$openFileScriptBlock = {
param(
$file,
$readOnly,
$processName=$null
)
#initiate variables
$loaded = $false
$file = get-item $file
$processLastCpu = 0
$timeout = 0
if ($readonly -and !$file.isReadOnly){
$file.isReadOnly = $true
#call file with default application
$attempts = 0
while ($true){
try{$startedProcess = start-process "$($file.fullname)" -PassThru; break}
catch{
$attempts++
if ($attempts -eq 3){return "cannot open file: $file, Error:$_"}
}
}
start-sleep -seconds 2
if ($processName){
$processName = $startedProcess.name
if ($processName -eq "SWSHEL~1"){$processName = "SLDWORKS"}
}
#wait until process shows up in the process manager
while ($loaded -eq $false -and $timeout -lt 25 ){
try {
$process = get-process -name $processName -erroraction 'stop'
if ($?){$loaded = $true; $timeout = 0} else {throw}
}catch{start-sleep -milliseconds 200; $timeout++}
}
start-sleep -seconds 2
#wait for process to go idle
while ($process.cpu -ne $processLastCpu -and $timeout -lt 10){
$processLastCpu = $process.cpu
start-sleep -milliseconds 500
$timeout++
}
$file.isreadonly = $false
} else {start-process "$($file.fullname)"}
return ,$file
}
if (!(test-path -path $file)){update-message "File not found: $file"; return}
$openFileJob = start-job -name 'openfile' -scriptblock $openFileScriptBlock -argumentlist $file, $readOnly, $processName
Register-ObjectEvent $OpenFileJob StateChanged  -Action {
$jobResult = $sender | receive-job
$sender | remove-job -Force
unregister-event -sourceIdentifier $event.sourceIdentifier
remove-job -name $event.sourceIdentifier -force
try{update-message "opened file $($jobResult.name)"}
catch{update-message $jobResult}
} | out-null
}

我知道这是一个老问题,但我想知道你是否能找到解决方案?如果没有,有一些事情你可以尝试:首先,如果你的代码打开任何其他文件都很好,它似乎不存在,问题就在那里。

与所有SLD文件的文件关联在大多数时间都在工作;但我们确实看到它不时地变得糟糕(通常与更新有关(,在这种情况下,请仔细检查所有SLD文件类型是否设置为使用"Solidworks Launcher"打开(而不是直接打开Solidworks(。使用启动器,将确保Solidworks不会试图打开一个文件,进入一个已经运行的Solidworks实例。

此外,请尝试检查以下内容:Solidworks选项->协作->'启用多用户环境'。。。这是套装吗?无论它处于什么状态;尝试改变是相反的。该复选标记允许多个Solidworks用户同时打开同一个文件,它通过更改文件的读取状态来做到这一点。(可能是干扰了你的代码(

这两种东西都是特定于PC的,所以如果你在一台机器上更改它们,可能也需要在其他机器上更改。

最新更新