{"record":{"id":"c3ef1292500405b9","repo":"wavetermdev/waveterm","slug":"error-writing-pwsh-integration-wavepwsh-ps1-v","errorCode":null,"errorMessage":"error writing pwsh-integration wavepwsh.ps1: %v","messagePattern":"error writing pwsh-integration wavepwsh\\.ps1: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/util/shellutil/shellutil.go","lineNumber":423,"sourceCode":"\terr = utilfn.WriteTemplateToFile(filepath.Join(zshDir, \".zshenv\"), ZshStartup_Zshenv, params)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error writing zsh-integration .zshenv: %v\", err)\n\t}\n\terr = utilfn.WriteTemplateToFile(filepath.Join(bashDir, \".bashrc\"), BashStartup_Bashrc, params)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error writing bash-integration .bashrc: %v\", err)\n\t}\n\terr = os.WriteFile(filepath.Join(bashDir, \"bash_preexec.sh\"), []byte(BashStartup_Preexec), 0644)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error writing bash-integration bash_preexec.sh: %v\", err)\n\t}\n\terr = utilfn.WriteTemplateToFile(filepath.Join(fishDir, \"wave.fish\"), FishStartup_Wavefish, params)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error writing fish-integration wave.fish: %v\", err)\n\t}\n\terr = utilfn.WriteTemplateToFile(filepath.Join(pwshDir, \"wavepwsh.ps1\"), PwshStartup_wavepwsh, params)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error writing pwsh-integration wavepwsh.ps1: %v\", err)\n\t}\n\n\treturn nil\n}\n\nfunc initCustomShellStartupFilesInternal() error {\n\tlog.Printf(\"initializing wsh and shell startup files\\n\")\n\twaveDataHome := wavebase.GetWaveDataDir()\n\tbinDir := filepath.Join(waveDataHome, WaveHomeBinDir)\n\terr := InitRcFiles(waveDataHome, binDir)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = wavebase.CacheEnsureDir(binDir, WaveHomeBinDir, 0755, WaveHomeBinDir)\n\tif err != nil {\n\t\treturn err\n\t}","sourceCodeStart":405,"sourceCodeEnd":441,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/util/shellutil/shellutil.go#L405-L441","documentation":"InitRcFiles wraps a failure from utilfn.WriteTemplateToFile when writing wavepwsh.ps1 into the pwsh-integrations directory. This is the last rc file in the sequence; failure means the PowerShell integration script could not be materialized, usually due to filesystem permissions or locks.","triggerScenarios":"InitRcFiles / InstallRcFiles failing to open/replace <pwshDir>/wavepwsh.ps1: ACL denial on Windows, file locked by an open PowerShell session or AV scanner, missing dir, or template render error.","commonSituations":"Windows: OneDrive/Dropbox-synced wave dir locking files; controlled-folder-access blocking writes; POSIX: ro-mounted home; PowerShell sessions holding the .ps1 open.","solutions":["Close open PowerShell sessions and exclude the wave data dir from AV/sync tools, then retry.","Fix ACLs/permissions on the pwsh-integrations directory so the user can write.","Delete wavepwsh.ps1 (or the whole pwsh-integrations dir) and rerun initialization.","Check the wrapped %v text for the specific underlying error."],"exampleFix":"// before: Windows Defender controlled folder access blocks write\n// after: add wave data dir to allowed apps list, or\nPS> icacls \"$env:USERPROFILE\\.waveterm\\pwsh-integrations\" /grant \"$env:USERNAME:(OI)(CI)F\"","handlingStrategy":"validation","validationCode":"// PowerShell/Windows: confirm ACL allows write before init\nfi, err := os.Stat(pwshDir)\nif err != nil || !fi.IsDir() { os.MkdirAll(pwshDir, 0755) }\nprobe := filepath.Join(pwshDir, \".probe\")\nif err := os.WriteFile(probe, nil, 0644); err != nil {\n\treturn fmt.Errorf(\"pwsh-integrations not writable (check ACL/AV locks): %w\", err)\n}\nos.Remove(probe)","typeGuard":null,"tryCatchPattern":"if err := shellutil.InitRcFiles(home, binDir); err != nil {\n\tvar pe *os.PathError\n\tif errors.As(err, &pe) && runtime.GOOS == \"windows\" {\n\t\tlog.Printf(\"pwsh write blocked on %s: %v; retry after closing PowerShell/AV\", pe.Path, pe.Err)\n\t}\n\treturn err\n}","preventionTips":["Keep the wave data dir out of OneDrive/Dropbox sync folders on Windows.","Add the wave data dir to Defender controlled-folder-access allowlist.","Close pwsh sessions that sourced wavepwsh.ps1 before upgrading.","Recreate the pwsh-integrations dir if wavepwsh.ps1 is in a corrupt state."],"tags":["filesystem","shell-integration","powershell","file-write"],"backgroundTag":"file-write-permission-denied","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}