gpt4 book ai didi

command-line - 从环境变量中去除回车符 - XP 命令行

转载 作者:行者123 更新时间:2023-12-04 04:08:00 26 4
gpt4 key购买 nike

在 Windows XP 批处理文件中,我抓取了一个 FTP 目录列表并用 For /F 处理它。环形。包含文件名的最后一个标记以回车符 (0D) 作为变量中的最后一个字符结束。检索后,我尝试使用 token 中的值失败,因为回车导致我的 If语句换行到行首。

@echo off
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
if 'Stuff.zip'=='%%B' Set StuffDate=%%A
)
echo Stuff.zip was saved on %StuffDate%.

需要处理的内容如下:
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
01-04-10 10:00AM 93882 Logo.jpg
02-05-10 11:01PM <DIR> PCODE
03-06-10 12:02PM 42333443 Saved stuff.zip
04-07-10 12:42PM 49343848 Stuff.zip
226 Transfer complete.

使用十六进制编辑器检查后,每行都以 0D 0D 0A 结尾,而不仅仅是 0D 0A。我不确定为什么会有额外的 0D,但我需要删除它才能让我的程序正常运行。

在 %%B 等于 Stuff.zip 的执行过程中, If应该是这样的:
( if 'Stuff.zip'=='Stuff.zip' Set ReleaseDate=04-07-10 ) 
If由于 CR,行最终看起来像这样:
' Set ReleaseDate=04-07-10 )  'Stuff.zip
( if 'Stuff.zip'=='Stuff.zip在处理 0D 回车时被覆盖。

如何摆脱环境变量末尾的额外 0D?

最佳答案

即使您的代码行看起来很奇怪,它也能正常工作。
但是在您的情况下,有多种方法可以删除 <CR> .

第一种也是最简单的方法 - 使用批处理解析器,因为解析器会删除所有 <CR>在百分比扩展阶段之后和特殊字符阶段之前的字符。

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
set "fileName=%%B"
call :removeCR
if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A
)
echo Stuff.zip was saved on %StuffDate%.
goto :eof

:removeCR
set "fileName=%fileName%"
goto :eof

但通常这种解决方案可能会导致一些特殊字符的问题,如感叹号引号等。

另一种方法是更换 <CR>带有空字符串。
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
set "fileName=%%B"
call :removeCR
if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A
)
echo Stuff.zip was saved on %StuffDate%.

:removeCR
set "fileName=%fileName:<CR>=%"
goto :eof
<CR>在线 set "fileName=%fileName:<CR>=%"必须使用十六进制编辑器更改为 0x0D。
但是这个解决方案和第一个解决方案一样有特殊字符问题,你不能用普通的文本编辑器创建它。

最后一个解决方案创建了一个 <CR>并在 :removeCR 中使用它具有延迟扩展功能。
此解决方案对除感叹号以外的所有特殊字符都是安全的。
@echo off
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
set "fileName=%%B"
call :removeCR
if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A
)
echo Stuff.zip was saved on %StuffDate%.

:removeCR
for %%a in ("!CR!") do (
set "fileName=!fileName:%%~a=!"
)
goto :eof

关于command-line - 从环境变量中去除回车符 - XP 命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6485287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com