call cmd /c start 一点疑问

本文探讨了在不同路径下执行bat文件的问题。作者尝试通过调用cmd来启动位于特定路径的bat文件,但在某些情况下只能打开新的命令提示符窗口而无法执行预期的脚本。
call "cmd /c start aaa.bat"
这一句在aaa.bat文件目录下可执行

call "cmd /c start "c:\aaa.bat""
这个在任何目录不能执行,只会新建一个cmd窗口,目录为当前目录,啥也不做,不知出了啥问题

call "cmd /c start c:\aaa.bat"
这个可以执行
<think> 我们在64位Windows系统中使用批处理脚本启动32位程序时,可能会遇到文件系统重定向问题(即程序默认在SysWOW64目录下查找文件)。要自定义程序的工作目录(即配置文件查找目录),可以通过以下两种方法实现: ### 方法一:使用`start`命令的`/D`参数指定工作目录 在批处理脚本中,使用`start`命令的`/D`参数可以显式设置程序的工作目录。例如: ```batch @echo off rem 指定工作目录为 D:\MyApp\Config start "" /B /D "D:\MyApp\Config" "C:\Program Files (x86)\MyApp\app.exe" ``` - `""`:窗口标题(可为空) - `/B`:不创建新窗口(后台启动) - `/D "路径"`:设置启动程序的工作目录 ### 方法二:先切换当前目录再启动程序 通过`cd /d`命令切换当前工作目录,然后启动程序(程序会继承当前目录): ```batch @echo off rem 切换到目标工作目录 cd /d "D:\MyApp\Config" rem 启动程序(注意使用完整路径) start "" /B "C:\Program Files (x86)\MyApp\app.exe" ``` ### 关键说明 1. **路径重定向问题**:64位Windows运行32位程序时,系统会将`%windir%\System32`重定向到`%windir%\SysWOW64`[^1]。通过显式设置工作目录,可以避免程序在`SysWOW64`中查找配置文件。 2. **路径格式**:目录路径包含空格时,必须用双引号包裹(如`"C:\Program Files (x86)"`)。 3. **权限问题**:确保目标目录存在且应用程序有访问权限。 ### 完整示例脚本 ```batch @echo off setlocal rem 设置自定义工作目录和程序路径 set WORK_DIR=D:\AppData\Config set APP_PATH="C:\Program Files (x86)\MyApp\app.exe" rem 检查目录是否存在 if not exist "%WORK_DIR%" ( echo 创建目录: %WORK_DIR% mkdir "%WORK_DIR%" ) rem 在自定义工作目录中启动32位程序 start "" /B /D "%WORK_DIR%" %APP_PATH% endlocal ``` ### 验证方法 在应用程序中添加以下代码(以C#为例)打印当前工作目录: ```csharp Console.WriteLine("当前工作目录: " + Environment.CurrentDirectory); ``` 运行批处理脚本后,应用程序输出的工作目录应为`D:\AppData\Config`。 §§相关问题§§ 1. 如何防止Windows文件系统重定向影响32位程序运行? 2. 批处理脚本中如何检测程序是否成功启动? 3. 如何在批处理脚本中实现目录存在性检查? 4. 如何以管理员权限运行批处理脚本并启动32位程序? [^1]: Windows系统对32位程序的文件系统重定向机制(System32重定向到SysWOW64) </think>在Windows 64位系统的批处理脚本中,使用`start /B cmd /c`启动32位程序时,可以通过以下方法自定义程序的工作目录(即配置文件查找目录): ### 解决方案 1. **使用`/D`参数指定工作目录**: ```batch @echo off rem 使用start命令的/D参数直接指定工作目录 start "" /B /D "D:\Custom\Config" cmd /c "C:\Program Files (x86)\YourApp\app.exe" ``` - `/D "路径"`:强制设置程序的工作目录 - `""`:窗口标题占位符(可为空) - `/B`:后台启动(不创建新窗口) 2. **嵌套使用`cd`命令**: ```batch @echo off rem 在子cmd中先切换目录再启动程序 start "" /B cmd /c "cd /d D:\Custom\Config && C:\Program Files (x86)\YourApp\app.exe" ``` - `&&`:连接多个命令,确保顺序执行 - `cd /d`:支持跨驱动器切换目录 3. **创建临时批处理文件**(复杂场景): ```batch @echo off set TMP_SCRIPT=%TEMP%\launch_temp.bat rem 创建临时批处理 echo @echo off > "%TMP_SCRIPT%" echo cd /d "D:\Custom\Config" >> "%TMP_SCRIPT%" echo start "" "C:\Program Files (x86)\YourApp\app.exe" >> "%TMP_SCRIPT%" rem 执行临时批处理 start "" /B cmd /c call "%TMP_SCRIPT%" rem 清理临时文件 timeout /t 1 >nul del "%TMP_SCRIPT%" ``` ### 关键原理 1. **工作目录继承链**: ```mermaid graph TD A[主批处理] --> B[cmd /c] B --> C[32位程序] style A fill:#cff,stroke:#333 style B fill:#f9f,stroke:#333 style C fill:#9f9,stroke:#333 ``` - 通过`/D`参数或`cd`命令修改`cmd /c`的工作目录 - 32位程序会继承`cmd /c`进程的当前目录[^1] 2. **SysWOW64重定向覆盖**: - 显式设置工作目录优先级高于系统默认的`SysWOW64` - 程序将直接在指定目录查找配置文件 ### 完整示例脚本 ```batch @echo off setlocal enabledelayedexpansion rem 设置路径变量 set APP_PATH="C:\Program Files (x86)\MyApp\app.exe" set CONFIG_DIR="D:\AppData\Config" rem 验证目录存在 if not exist %CONFIG_DIR% ( echo 创建配置目录: %CONFIG_DIR% mkdir %CONFIG_DIR% ) rem 方法1:直接使用/D参数 start "" /B /D %CONFIG_DIR% cmd /c %APP_PATH% rem 方法2:在子命令中切换目录(备用方案) rem start "" /B cmd /c "cd /d %CONFIG_DIR% && %APP_PATH%" echo 已启动程序,工作目录设置为: %CONFIG_DIR% endlocal ``` ### 注意事项 1. **路径空格处理**: - 包含空格的路径必须用双引号包裹 - 错误示例:`start /B cmd /c C:\Program Files\app.exe`(会解析为两个参数) 2. **权限问题**: - 服务脚本运行时可能需要管理员权限 - 在脚本开头添加:`if not "%1"=="admin" (fltmc >nul 2>&1 && shift && goto :admin)` 3. **环境变量传递**: - 使用`setx`或临时文件传递变量给子进程 ```batch setx APP_CONFIG_DIR "D:\Config" /M start "" /B cmd /c %APP_PATH% ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值