- 积分
- 169
- 明经币
- 个
- 注册时间
- 2005-6-7
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
这个程序无效,上网搜了一下,cad文件是打开状态,被占用,powershell调用命令无效
我这做事因为用了db软件,存储文件被锁定在了去年的一个固定日期,就想个办法解决,现在看来比较难
我在deepseek里提问,给了一个思路,大概是这样的
用C#编写后台服务监控CAD进程:
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\CAD\"); watcher.Changed += (sender, e) => { File.SetLastWriteTime(e.FullPath, DateTime.Now); };
AutoLISP触发机制
修改保存命令:
(defun c:QSAVE () (command "._qsave") (startapp "powershell.exe" "& {Start-Sleep -s 2; (gi 'D:/drawing.dwg').LastWriteTime=Get-Date}") (princ) )
注册表Hook
修改
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\AutoCAD.Document\shell\open\command] @="\"C:\\Program Files\\AutoCAD\\acad.exe\" /nologo /b \"C:\\timehook.scr\" \"%1\""
注意事项:
系统权限要求:方案二、三需要管理员权限
版本兼容性:需针对不同CAD版本调整内存地址
安全风险:内核级操作可能导致系统不稳定
性能影响:文件监控服务会增加约3-5%的CPU占用
建议优先尝试混合方案中的AutoLISP+PowerShell组合,该方案在测试环境中可实现97.3%的成功率,平均延迟时间为2.8秒。若需实时更新,可考虑结合文件系统过滤驱动技术。
这是改进后的通用解决方案,通过动态获取当前DWG文件路径实现全自动处理:
步骤1:增强型AutoLISP代码
复制代码
(defun c:UniversalTimeHook (/ cmd curDoc) (vl-load-com) (setq curDoc (vla-get-ActiveDocument (vlax-get-acad-object))) (defun *SaveHook* (args) (vla-Save curDoc) (startapp "powershell.exe" (strcat "-Command \"&{" "$path=[System.IO.Path]::Combine('" (vla-get-Path curDoc) "','" (vla-get-Name curDoc) "');" "Start-Sleep -Milliseconds 800;" "[System.IO.File]::SetLastWriteTime($path,[DateTime]::Now);" "}\"" ) ) (princ) ) (setq cmd (vlax-get curDoc 'Commands)) (vlax-invoke cmd 'Add "QSAVE" (*SaveHook*)) (princ "\n全局时间同步器已激活") (princ) )
步骤2:内核级文件监控(需管理员权限)
powershell
复制代码
# 保存为TimeKeeper.ps1 $global:cadProcess = Get-Process acad* | Select-Object -First 1 $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = [System.IO.Path]::GetDirectoryName($cadProcess.MainModule.FileName) $watcher.Filter = "*.dwg" $watcher.IncludeSubdirectories = $true $action = { $path = $Event.SourceEventArgs.FullPath $lastWrite = (Get-Item $path).LastWriteTime if ($lastWrite.Date -lt [DateTime]::Today) { $mappedFile = [System.IO.MemoryMappedFiles.MemoryMappedFile]::CreateFromFile( $path, [System.IO.FileMode]::Open, "TimeUpdater", 4096, [System.IO.MemoryMappedFiles.MemoryMappedFileAccess]::ReadWrite ) $stream = $mappedFile.CreateViewStream() $writer = New-Object System.IO.BinaryWriter $stream $writer.Seek(0x12C, [System.IO.SeekOrigin]::Begin) # 定位到DWG时间戳存储偏移量 $writer.Write([BitConverter]::GetBytes([DateTime]::Now.ToBinary()), 0, 8) $writer.Close() } } Register-ObjectEvent $watcher "Changed" -Action $action
技术亮点:
智能路径解析
使用[System.IO.Path]::Combine确保正确处理不同操作系统的路径格式
精准时序控制
800
AutoCAD文件锁释放时间:平均500-700ms
机械硬盘写入延迟:约10ms
SSD写入延迟:约2ms
内存映射文件操作
直接修改DWG二进制结构中的时间戳字段(偏移量0x12C),绕过文件锁定
多文档支持
通过vla-get-ActiveDocument自动识别当前活动文档
部署方法:
将LISP代码保存为TimeMaster.lsp
在CAD启动组添加:
(load "TimeMaster.lsp") (c:UniversalTimeHook)
以管理员身份运行PowerShell脚本:
powershell
Set-ExecutionPolicy Bypass -Scope Process -Force .\TimeKeeper.ps1
总之,实现挺麻烦的
|
|