windows-shell
Windows Shell Skill
This skill provides guidelines for handling Windows filesystem paths and commands to avoid common pitfalls when using Claude Code on Windows.
Core Principles
Path Formats
In Skills and Configuration:
- Always use forward slashes (Unix-style):
scripts/helper.py - Never use backslashes in Skills:
scripts\helper.py - This ensures cross-platform compatibility
In Bash Commands:
- Always quote paths with spaces or backslashes:
cd "C:\KolyaRepositories\project" - Without quotes, backslashes are lost:
cd C:\KolyaRepositories\project - Result:
/usr/bin/bash: line 1: cd: C:KolyaRepositoriesproject: No such file or directory
Shell Command Patterns
Good patterns:
# Quoted paths work reliably
cd "C:\KolyaRepositories\repo" && git status
# Multiple commands in sequence
cd "C:\KolyaRepositories\repo" && git rev-parse --abbrev-ref HEAD && git status --short
# Direct git commands without piping
git status --short
Bad patterns:
# Unquoted paths fail
cd C:\KolyaRepositories\repo && git status
# Piping to findstr after cd fails
cd "C:\KolyaRepositories\repo" && git status --short | findstr /R "."
# Error: FINDSTR: Cannot open repo
# PowerShell via -Command loses cd context
cd "C:\KolyaRepositories\repo" && powershell -Command "git status --short | Where-Object { $_ }"
# Error: The term 'C:\KolyaRepositories\repo' is not recognized
Common Pitfalls
1. Findstr After Directory Change
Problem: findstr interprets the directory name as a file argument when piped after cd.
# Fails
cd "C:\KolyaRepositories\calc" && git status --short | findstr /R "."
# Error: FINDSTR: Cannot open calc
Solution: Use direct commands without unnecessary pipes.
# Works
cd "C:\KolyaRepositories\calc" && git status --short
2. PowerShell Context Loss
Problem: Using powershell -Command after cd causes the shell context to be misinterpreted.
# Fails
cd "C:\KolyaRepositories\calc" && powershell -Command "git status --short | Where-Object { $_ }"
# Error: The term 'C:\KolyaRepositories\calc' is not recognized
Solution: Either use PowerShell directly from the start, or avoid PowerShell piping after bash cd.
# Works - all in PowerShell
powershell -Command "cd 'C:\KolyaRepositories\calc'; git status --short"
# Works - no PowerShell piping
cd "C:\KolyaRepositories\calc" && git status --short
3. Unquoted Paths in Bash
Problem: Bash strips backslashes from unquoted Windows paths.
# Fails
cd C:\KolyaRepositories\calc
# Error: cd: C:KolyaRepositoriescalc: No such file or directory
Solution: Always quote paths containing backslashes.
# Works
cd "C:\KolyaRepositories\calc"
4. Output Redirection to Null Device
Context: Claude Code uses Git Bash on Windows, which provides Unix-like paths.
In Git Bash (Claude Code default):
# CORRECT - Git Bash provides /dev/null
command > /dev/null 2>&1
# WRONG - creates a literal file named "nul" in working directory!
command >nul 2>&1
WARNING: Using >nul in Git Bash creates a file that pollutes git status. Always use /dev/null in Git Bash.
In PowerShell:
command 2>$null
command | Out-Null
5. PowerShell Special Character Escaping
Problem A - Negation Operator: When passing PowerShell commands via Bash, the exclamation mark character gets escaped to backslash-exclamation.
# Fails - ! becomes \!
powershell -Command "if (!(Test-Path 'file.txt')) { Write-Output 'missing' }"
# Error: \! is not recognized
Solution: Use -not instead of exclamation mark for negation.
# Works
powershell -Command "if (-not (Test-Path 'file.txt')) { Write-Output 'missing' }"
Problem B - Variable Interpolation:
PowerShell $variable syntax gets stripped when passed through Bash.
# Fails - $pdf and $sizeKB are empty
powershell -Command "$pdf = Get-Item 'file.pdf'; $sizeKB = [math]::Round($pdf.Length / 1KB, 1); Write-Output $sizeKB"
# Output: (empty or partial)
Solution: Use .ps1 script files for complex operations, or pipe output between simple commands.
# Works - use script file
powershell -ExecutionPolicy Bypass -File "script.ps1" -Path "file.pdf"
# Works - simple piped commands
powershell -Command "Get-Item 'file.pdf' | Select-Object Length"
Summary for inline PowerShell:
- Use
-notinstead of exclamation mark - Use script files for complex logic with variables
- Keep inline commands simple (single operation, pipe output)
Best Practices for Multi-Repo Operations
When iterating over multiple repositories (e.g., for status checks):
Pattern 1 - Sequential commands with &&:
cd "C:\KolyaRepositories\repo1" && git status --short
cd "C:\KolyaRepositories\repo2" && git status --short
Pattern 2 - Self-contained commands:
git -C "C:\KolyaRepositories\repo1" status --short
git -C "C:\KolyaRepositories\repo2" status --short
Pattern 3 - Parallel tool calls: Use multiple Bash tool calls in a single message for independent operations:
- Bash tool 1:
cd "C:\repo1" && git status - Bash tool 2:
cd "C:\repo2" && git status - Bash tool 3:
cd "C:\repo3" && git status
PowerShell vs Bash on Windows
When to Use PowerShell
Use PowerShell for:
- Windows-specific operations (registry, services, etc.)
- Complex filtering with
Where-Object,Select-Object - Working with .NET objects
- Windows system administration tasks
# PowerShell example
powershell -Command "Get-ChildItem -Path 'C:\KolyaRepositories' -Directory | Select-Object Name"
When to Use Bash (Git Bash/WSL)
Use Bash for:
- Git operations
- Standard Unix tools (grep, sed, awk)
- Cross-platform scripts
- Most development tooling (npm, docker, etc.)
# Bash example
cd "C:\KolyaRepositories\repo" && git status --short
Tools to Prefer Over Bash
For file operations, use specialized Claude Code tools instead of bash commands:
| Operation | Use Tool | Not Bash |
|---|---|---|
| Read files | Read tool |
cat, head, tail |
| Search files | Glob tool |
find, ls |
| Search content | Grep tool |
grep, rg |
| Edit files | Edit tool |
sed, awk |
| Write files | Write tool |
echo >, cat <<EOF |
Reserve Bash for actual terminal operations: git, npm, docker, build commands, etc.
Summary Checklist
Before running Windows filesystem commands:
- Paths with backslashes are quoted:
"C:\Path\To\Dir" - Using
/dev/nullfor output redirection in Git Bash (NOT>nulwhich creates a file) - No unnecessary pipes after
cd(especiallyfindstr,Where-Object) - Using specialized tools (Read, Glob, Grep) instead of bash for file ops
- Multiple independent operations use parallel tool calls
- Skills use forward slashes:
scripts/helper.py - PowerShell used for Windows-specific tasks, Bash for Unix-style operations
- Using
-notinstead of exclamation mark for PowerShell negation - Complex PowerShell logic in
.ps1files, not inline commands
Examples from Real Errors
Common Error Patterns:
findstraftercd→ FINDSTR: Cannot open [dirname]- PowerShell pipe after
cd→ The term 'C:...' is not recognized - Unquoted path → cd: C:KolyaRepositories... (backslashes stripped)
- Using
>nulin Git Bash → creates a literal file named "nul" polluting git status - Using exclamation mark in PowerShell via Bash → backslash-exclamation is not recognized
- Inline
$variablein PowerShell → variables are empty/stripped
Resolution: All resolved by following the patterns in this skill:
- Quote paths:
cd "C:\KolyaRepositories\repo" - Avoid pipes after cd:
git status --short(no| findstr) - Use
/dev/nullin Git Bash:command > /dev/null 2>&1(NOT>nul) - Use
-notinstead of exclamation mark for negation - Use
.ps1script files for complex PowerShell logic