【发布时间】:2018-05-07 21:41:22
【问题描述】:
我的安装需要检查来自cmd.exe 的命令的结果。因此,我将命令的结果重定向到一个文本文件,然后尝试读取该文件以获得如下结果:
// send command to cmd to execute and redirect the result to a text file
// try to read the file
szDir = "D:\\";
szFileName = "MyFile.txt";
if Is(FILEEXISTS, szDir ^ szFileName) then
listID = ListCreate(STRINGLIST);
if listID != LIST_NULL then
if OpenFIleMode(FILE_MODE_NORMAL) = 0 then
if OpenFile(nFileHandle, szDir, szFileName) = 0 then
// I run into problem here
while (GetLine(nFileHandle, szCurLine) = 0 )
ListAddString(listID, szCurLine, AFTER);
endwhile;
CloseFile(nFileHandle);
endif;
endif;
endif;
endif;
问题是,在执行命令提示符并将结果重定向到MyFile.txt 之后,我可以设置打开文件模式,打开文件但我无法将任何文本读入我的列表中。 ListReadFromFile() 没有帮助。如果我打开文件,手动编辑并保存它,我的脚本就可以工作了。
经过调试,我发现GetLine() 返回一个错误代码(-1),这意味着文件指针必须在文件末尾或其他错误。但是,FILE_MODE_NORMAL 将文件设置为只读并在文件开头设置文件指针。
我可能做错了什么?这与文件的读/写访问有关吗?我试过这个命令没有结果:
icacls D:\MyFile.txt /grant Administrator:(R,W)
我正在使用 IstallShield 2018 和 Windows 10 64 位 btw。非常感谢您的帮助。
编辑 1:我怀疑编码并尝试了一些方法:
运行“wslconfig /l”后,在Notepad++中打开的MyFile.txt内容没有编码,但仍正常可读。我尝试将内容转换为 UTF-8,但没有成功。
1234563 NULL (\0) 被添加到每个字符之间,甚至替换换行符。也许这就是 GetLine() 读取文件失败的原因。
解决方法:在第 1 步之后,我运行“find "my_desired_content" MyFile.txt” > TempFile.txt 并读取 TempFile.txt(以 UTF-8 编码)。
我的最终目标是检查“my_desired_content”是否出现在“wslconfig /l”的结果中,所以这很好。但是,我不明白的是 MyFile.txt 和 TempFile.txt 都是从 cmd 命令创建的,但它们的编码不同?
【问题讨论】:
-
鉴于下面 Michael 描述的问题,您能否在
cmd.exe中告诉我们您在做什么,以便我们看看是否有替代方案可以避免此技术问题? -
简而言之,就是想在cmd.exe中运行“wslconfig”后得到结果。你可以在这里找到你要找的东西:link.
-
是的,cmd 提示符和各种处理重定向的方式几乎是神奇的。但是
echo test > echo.txt、echo line2 >> echo.txt和wslconfig /l > wsl.txt产生非常不同的编码(ANSI CRLF vs Unicode CR w/o signature)。还要考虑wslconfig /l | findstr fault或wslconfig /l | findstr e;两者都产生奇怪的结果。我会考虑 wslconfig 如何将其输出写入根本原因(Windows API 提供了太多方法,通常有些不兼容),但是 GetLine 在它认为是 ANSI NULL 之后无法定位 CR/LF 字符导致了这里的问题. -
MSDN 上的这个讨论描述了相同的根本问题,即不同的程序控制自己输出的编码,如果您对 C/C++ API 层感兴趣:social.msdn.microsoft.com/Forums/windowsdesktop/en-US/… 和这个 SO 帖子有更多建议:stackoverflow.com/questions/285486/…
标签: installation command-prompt installshield