还没来得及看

本文详细介绍了Hadoop、Storm、Flink、Spark、Hbase、hive等大数据开发核心组件及其应用,深入剖析了Apache生态下数据处理与存储的关键技术。

 

http://quweiprotoss.blog.163.com/blog/

http://dikar.iteye.com/
http://blog.youkuaiyun.com/robertleepeak
http://blog.sina.com.cn/u/2011871313
http://haoningabc.iteye.com/blog/860411

http://hadoop.apache.org/common/docs/r0.19.2/cn/quickstart.html

http://blog.chinaunix.net/space.php?uid=22477743&do=blog&cuid=2046639
集群配置:

http://blog.youkuaiyun.com/duzidizou/article/details/6033462

http://www.rui-yang.com/?p=444

 

nutch:

http://shipmaster.iteye.com/blog/693221
http://a280606790.iteye.com/blog/827425
http://wenku.baidu.com/view/e63683c10c22590102029d3d.

<think> 问题分析: 用户遇到的问题是在批处理脚本中执行了类似以下代码后,命令行窗口立即关闭,导致无法查看执行结果: if %errorlevel% equ 0 ( exit /b 1 ) else ( exit /b 2 ) 原因分析: - 当脚本执行到`exit /b`时,会退出当前批处理脚本,并将错误码返回给调用者。 - 如果用户是双击运行批处理脚本,那么脚本执行完毕后窗口会自动关闭,因此看不到任何输出。 解决方案: 1. 在脚本末尾添加`pause`命令,使窗口暂停,等待用户按键后再关闭。 2. 使用`cmd /k`来运行脚本,这样脚本执行完毕后窗口不会关闭(但需要修改运行方式,不常用)。 3. 在退出前先显示错误码,并暂停。 针对用户提供的代码段,我们可以修改如下: 原代码: if %errorlevel% equ 0 ( exit /b 1 ) else ( exit /b 2 ) 修改后(添加暂停): if %errorlevel% equ 0 ( echo 返回错误码1 pause exit /b 1 ) else ( echo 返回错误码2 pause exit /b 2 ) 但是,注意:如果用户希望无论返回什么错误码都暂停,可以简化,在退出前统一暂停。 更简洁的修改方式(在退出前暂停): echo 程序即将退出,返回错误码:%errorlevel% pause if %errorlevel% equ 0 ( exit /b 1 ) else ( exit /b 2 ) 但是注意,上面的`echo`语句中显示的`%errorlevel%`是当前错误码(即上一条命令的退出码),而我们的判断也是基于这个错误码。然而,在`if`语句中再次使用`%errorlevel%`时,由于中间插入了`pause`和`echo`,可能会改变`errorlevel`(因为`pause`命令成功执行会重置`errorlevel`为0)。因此,我们需要先保存当前的错误码。 改进步骤: 1. 将当前的错误码保存到一个变量中。 2. 根据这个变量的值进行判断,并在退出前显示这个值,然后暂停。 修改后的代码: set myerror=%errorlevel% echo 程序即将退出,返回错误码:%myerror% pause if %myerror% equ 0 ( exit /b 1 ) else ( exit /b 2 ) 但这样修改后,返回给调用者的错误码是1或2,而实际上我们希望返回的是原错误码的转换(0->1, 非0->2)。所以逻辑不变。 然而,如果用户希望保留原始错误码并返回,则不需要转换,这里用户的需求是:当原错误码为0时返回1,非0时返回2。 因此,我们可以这样写: setlocal enabledelayedexpansion set "exitCode=2" if %errorlevel% equ 0 set "exitCode=1" echo 程序即将退出,返回错误码: !exitCode! pause exit /b !exitCode! 或者更直接: set err=%errorlevel% if %err% equ 0 (set result=1) else (set result=2) echo 返回错误码: %result% pause exit /b %result% 注意:在批处理中,如果使用`setlocal enabledelayedexpansion`,则可以用`!`来访问动态变量。但这里我们也可以不用延迟扩展,因为后续有在同一个块里修改变量。 但是,为了避免中间命令改变`errorlevel`,我们首先将错误码保存到变量中,然后使用这个变量。 因此,完整的示例脚本如下: @echo off rem 执行一些命令,可能会设置errorlevel some_command rem 保存错误码 set err=%errorlevel% rem 根据错误码设置退出码 if %err% equ 0 ( set result=1 ) else ( set result=2 ) rem 显示并暂停 echo 程序退出,返回码:%result% pause rem 退出并返回设定的错误码 exit /b %result% 但是,这里有一个问题:在`if`块中设置的变量`result`,在块外访问时,由于批处理的变量扩展在解析时完成,我们需要启用延迟扩展或者避免在块内设置变量。上面的代码在块内设置变量,但在块外访问,实际上是可以的,因为批处理在执行完整个块后才进行变量扩展。不过,为了确保安全,我们可以不使用块: @echo off set err=%errorlevel% if %err% equ 0 set result=1 if %err% neq 0 set result=2 echo 返回错误码: %result% pause exit /b %result% 或者更简洁: @echo off set err=%errorlevel% if %err% equ 0 (set result=1) else (set result=2) echo 返回错误码: %result% pause exit /b %result% 注意:在`if`语句中,括号内的命令被视为一个命令组,变量赋值在组内完成,但组外访问需要确保在同一个作用域。这里有使用`setlocal`,所以是全局变量,有问题。 另外,如果用户希望窗口在脚本退出后仍然保持打开,可以不在脚本中退出,而是让用户自己关闭窗口。但这样会改变退出码的返回(因为最后执行的是`pause`,`pause`的退出码是0,而且有机会返回我们设定的错误码)。所以必须使用`exit /b`来返回错误码。 然而,使用`pause`后,用户按任意键,脚本会继续执行到`exit /b`,然后窗口关闭。如果用户希望窗口保持打开,可以在脚本最后一行加上`cmd /k`,但这会改变整个脚本的退出方式(退出码会丢失),因此不推荐。 所以,推荐的方法就是在退出前暂停,并显示即将返回的错误码。 针对用户最初的问题,修改后的代码应该是: if %errorlevel% equ 0 ( set result=1 ) else ( set result=2 ) echo 退出代码: %result% (按任意键退出) pause>nul exit /b %result% 这里使用`pause>nul`可以隐藏“按任意键继续...”的提示,同时按任意键继续。 但注意:上面的`echo`中使用了`%result%`,而`result`是在块内设置的,在块外访问,由于批处理是逐行解析的,所以当执行到`if`块时,变量已经设置,然后在下一行`echo`时就可以展开。所以有问题。 然而,如果整个代码是在一个语句块中(比如在for循环中或者另一个if中),则需要使用延迟扩展。但用户提供的代码片段是独立的,所以可以这样写。 总结步骤: 1. 将错误码保存到变量(如果需要保留,因为后续命令可能会改变它)。 2. 根据条件设置退出码。 3. 显示退出码并暂停。 4. 使用`exit /b`返回退出码。 因此,用户可以将原来的代码替换为: setlocal set err=%errorlevel% if %err% equ 0 (set exitCode=1) else (set exitCode=2) echo 程序退出,返回码: %exitCode% pause endlocal & exit /b %exitCode% 但是,注意`endlocal`会撤销`setlocal`之后的环境变量更改,所以`exitCode`变量在`endlocal`之后就不存在了。因此,我们需要在`endlocal`之前将退出码保存到另一个地方,或者使用另一种方式。 我们可以这样: setlocal enabledelayedexpansion set err=%errorlevel% if %err% equ 0 (set exitCode=1) else (set exitCode=2) echo 程序退出,返回码: !exitCode! pause endlocal & exit /b %exitCode% 但是,这里在`endlocal`之后,`exitCode`变量已经被撤销,所以`%exitCode%`会被替换为空。因此,我们需要在`endlocal`之前将退出码保存到不会因为`endlocal`而撤销的地方,比如使用一个临时文件,或者不使用`setlocal`。 如果不使用`setlocal`,那么变量是全局的,不会有问题。但为了避免污染环境,我们可以采用另一种方法: for /f %%i in ('exit /b %exitCode%') do endlocal & exit /b %%i 这样也不行,因为`exit /b`不能这样执行。 更简单的方法:不使用`setlocal`,或者接受环境变量的污染(对于简单的脚本,通常可以不用`setlocal`)。 因此,如果脚本不复杂,可以省略`setlocal`。 所以,最终的解决方案(不使用`setlocal`)如下: @echo off ... 其他代码 ... rem 保存错误码 set err=%errorlevel% rem 设置退出码 if %err% equ 0 (set exitCode=1) else (set exitCode=2) rem 显示并暂停 echo 程序即将退出,返回码: %exitCode% pause rem 退出 exit /b %exitCode% 这样,在双击运行时,窗口会暂停,显示返回码,按任意键后窗口关闭,同时返回正确的退出码。 另外,如果用户希望窗口不关闭,那么可以建议用户从命令行运行脚本,这样脚本结束后窗口仍然保留。但这不是修改脚本本身。 所以,我们主要修改脚本,在退出前暂停。 </think>### 解决批处理脚本执行后窗口关闭问题 当您在批处理脚本中执行 `if %errorlevel% equ 0 ( exit /b 1 ) else ( exit /b 2 )` 后命令行窗口立即关闭,这是因为 `exit /b` 命令会立即退出批处理进程。以下是几种解决方案: #### 方法1:添加暂停命令(推荐) ```batch :: 在退出命令前添加暂停 if %errorlevel% equ 0 ( echo 将返回错误码1 (按任意键退出) pause >nul exit /b 1 ) else ( echo 将返回错误码2 (按任意键退出) pause >nul exit /b 2 ) ``` #### 方法2:使用 `cmd /k` 调用脚本 ```batch :: 修改脚本调用方式(在命令行中执行) cmd /k "your_script.bat" ``` #### 方法3:添加永久暂停(调试用) ```batch :: 在脚本末尾添加永久暂停 if %errorlevel% equ 0 ( exit /b 1 ) else ( exit /b 2 ) :: 添加永久暂停(永远不会执行到,但可防止窗口关闭) pause ``` ### 解决方案详解 1. **`pause >nul` 技巧**(最佳实践): - `pause` 命令会显示"按任意键继续..."并等待用户输入 - `>nul` 重定向隐藏提示信息 - 在退出前给用户查看结果的时间 2. **错误码处理优化**: ```batch @echo off setlocal enabledelayedexpansion :: 保存当前错误码 set "last_error=%errorlevel%" :: 显示调试信息 echo [调试] 最后错误码: !last_error! echo [调试] 按任意键退出并返回转换后的错误码... :: 暂停并转换错误码 pause >nul if !last_error! equ 0 (exit /b 1) else (exit /b 2) ``` ### 关键说明 1. **延迟扩展必要性**: - 使用 `!var!` 而非 `%var%` 防止值被提前解析 - 需配合 `setlocal enabledelayedexpansion` 2. **错误码转换逻辑**: - `exit /b N` 将返回码 `N` 给调用进程 - `%errorlevel%` 总是包含**上一条命令**的退出码 3. **管理员权限提示**: ```batch :: 检查管理员权限 net session >nul 2>&1 if %errorlevel% neq 0 ( echo 请以管理员身份运行脚本! pause exit /b 1 ) ``` ### 完整示例脚本 ```batch @echo off setlocal enabledelayedexpansion echo 正在执行操作... dir C:\nonexistent_folder 2>nul set "err=%errorlevel%" echo 原始错误码: %err% if %err% equ 0 ( echo 将返回转换码: 1 pause >nul exit /b 1 ) else ( echo 将返回转换码: 2 pause >nul exit /b 2 ) ``` ### 注意事项 1. **重定向技巧**: - `>nul` 隐藏成功输出 - `2>nul` 隐藏错误输出 2. **错误码范围**: - Windows 错误码为 32 位整数(0-4294967295) - 约定:0=成功,非0=失败 3. **跨版本兼容**: - 所有方案兼容 Windows XP 到 Windows 11 - 在批处理(`.bat`)和命令脚本(`.cmd`)中均有效 > 最佳实践:始终在可能退出的关键操作前添加 `pause`,调试完成后再移除。对于生产环境,可改用日志文件记录:`echo %date% %time% 错误码: %errorlevel% >> script.log`[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值