V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  geelaw  ›  全部回复第 10 页 / 共 172 页
回复总数  3422
1 ... 6  7  8  9  10  11  12  13  14  15 ... 172  
@ysc3839 #15 我以为之前已经算是提到了这个区别了。cmd 有自己的转义,但 cmd 当然不负责外部命令如何理解命令行。MSVC CRT 解析 argv 不是 CommandLineToArgvW 我倒是不知道,另外我刚发现 CommandLineToArgvW 读取空格开头的字符串时会把第一个 argv 设置为空串 orz

除了提醒 lpCmdLine 不需要有 argv 的格式,还应该注意即使 lpCmdLine 解析为 argv ,第一个参数也不一定是程序的名字或者路径。
另外 cmd 本身还有自己的内部命令和转义,比如 ^、管道、重定向,除非你的目的就是完全按照 cmd 执行命令,否则用 cmd /c 是错误的。

如果你想用 cmd /c ,那就不能用 argv 传参,而要用直接可以 ShellExecute/CreateProcess 的 API ,这样才能确保命令行准确传递(而不是经过 argv 互转,这个转换对 command line 来说不“往返”,对 argv 往返)。
@LonnyWong Windows 上标准解析命令行的方式是有文档的,https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw

解析方法如下(我随便瞎写的,不一定准确):
0. 若字符串只有空格,则设置 argc 为 1 ,argv[0] 为空串,否则转到 1
1. 去掉开头的空格,若已经没有字符,则结束,否则设置状态为无 quote ,设置当前实参为空字符串,转到 2
2. 下一个字符
2.1. 如果现在是无 quote 且这个字符是空格,则把当前实参加入 argv 并转到 1
2.2. 如果接下来有 2n 个 \ 之后紧跟一个 ",则在当前实参中追加 n 个 \,反转 quote 状态,并转到 2
2.3. (2n+1) \ + ",追加 n 个 \ 和 1 个 ",转到 2
2.4. 其他字符,则追加当前字符并转到 2
3. 把最后一个实参加入 argv
例子:
exec.Command("C:\\WINDOWS\\System32\|OpenSSH\\ssh.exe", "-V")

go 和 ssh 理应 Windows 上能正确互转 command line 和 argv 。
为什么要多此一举透过 cmd ?另外从 go 的 API 设计可以看出它必须用 Unix 的方式传入 argv ,而不是 Windows 的 command line 。而 cmd 是按照 command line 而不是 argv 读取命令的,因为同一组 argv 有无限种不同的 command line 表示,而且这些会被 cmd 理解为不同的意思,所以不存在可靠的用 go 的 exec 调用 cmd 的方法。

如果你要调用 ssh 并传入 -V ,可以直接传入合适的 argv 。
206 天前
回复了 xloger 创建的主题 Java 请教个 Java LinkedList 用法的问题
只有反复修改的情况下才需要考虑数组/链表等数据结构。

>我需要将用户手机的全部图片、视频按时间倒序添加到一个 List 里。基于 Android 的 API 限制,图片和视频的查询是分开的,故有大量的中间插入需求。

这个很简单,你可以先把所有的图片和视频都弄到一个巨大的 ArrayList 里,然后再排序。我没做过 Android 开发,猜测 API 提供按时间顺序分别获取图片、视频的功能,那么你可以先准备好两个 ArrayList ,分别得到正确顺序的图片、视频,然后做一轮归并即可。
207 天前
回复了 zzzkkk 创建的主题 PowerShell powershell setx 变量后无法自身得到变量值
setx 设置的环境变量并不会立刻被 cmd.exe 读取啊,但是 explorer.exe 会知道,所以下次从 explorer.exe 启动 cmd.exe 的时候能 echo %classpath% 看到。

PowerShell 里读取进程环境变量的方式是 $env:EnvironmentVariableName ,而 %classpath% 只是普通字符串。

Write-Verbose $env:classpath -Verbose

就可以在 verbose 流看到了。
@MFWT #14
@aliveyang #16
@hanqian #25

我印象里大多数软件都是不额外建立目录的,但多数软件的安装程序的默认目录都是不存在的目录(比如目录是 C:\Program Files\ProductName )而且如果目标目录安装前已经存在且不是这个软件的旧版本(原地更新的话)会警告用户。

@yigecaiji #36

规范是默认安装在 %LOCALAPPDATA%\Programs (单用户)或者 %PROGRAMFILES%(整个系统)里面,并且建立 ProductName 或者 CompanyName\ProductName 子目录,以及 Windows 应用商店应用由 Windows 部署。
213 天前
回复了 tool2d 创建的主题 程序员 感觉 double 精度不够用啊
第一个考虑的方向是条件数,从三个平直系坐标计算三角形面积,在所给的输入处的条件数是 400 亿,这说明计算结果只能期待 <6 位有效数字。

第二个考虑的方向是误差累积,楼主的算法,绝对误差是 (sum |x_i| + sum |y_i|) * eps (这个界比较松)。

如果先把任意一个点平移到原点,则绝对误差是 (sum |x_i - x_1| + sum |y_i - y_1|) * 2eps ,是更好的策略。
214 天前
回复了 fatyoung 创建的主题 Linux 关于 Linux 进程权限和用户权限的一点疑问
是运维先建立好账户设置好权限,然后再把部署好的程序以那个账户启动。这个问题和是哪种操作系统也没有关系。

> 然后我请求了一个接口,去访问某个文件,那我怎么确认该请求是否有权限访问

如果程序想要知道自己是否有权限访问某个文件,惟一正确的方法是尝试以需要的访问方式(读、写、读写)打开并使用。提前检查后再打开无意义,因为在检查完毕后、打开之前,别的程序可以修改文件的权限;如果不想要访问文件,则是否有权限访问的问题是无意义的。
至于原来的代码为什么不行,假设 batch 是 UTF-8 保存的,且本机代码页是 936 ,那么最终有颜色的输出结果是 "ʲô",这是把 "什么" 用 Windows-936 (~ GB) 编码之后再用 UTF-8 解码,这说明 cmd 设置变量的时候,是用 UTF-8 解读 batch 文件的(从而正确把文件中的字节解读为 "什么"),但是数据传入 findstr.exe 之后变成了 Windows-936 ,这很可能是因为 findstr.exe 使用的不是 WCHAR 而是 CHAR (因此 argv 是根据系统代码页,也就是 936 ,解读的,因此 findstr.exe 内部看到的是 GB 编码的 "什么"),并且在最后 findstr.exe 向控制台以输出了它所得到的字节流(即输出了 GB 编码的 "什么")——但控制台的代码页是 UTF-8 ,因此它把 GB 编码的 "什么" 用 UTF-8 解读并显示。
这段代码相当糟糕,是利用 findstr 这个工具显示文件名,因此你传入的字符串必须是合法的文件名,而且显示的时候会覆盖当前目录下的同名文件——总之就是个不定时炸弹。

如果必须要用 batch ,推荐 https://gist.github.com/mlocati/fdabcaeb8071d5c75a2d51712db24011
否则可以考虑 PowerShell

另外请不要在 bat 里面 chcp ,这是在劫持用户的 console ,而且我没找到如何让 Windows 以固定的编码读取 batch 的功能,它或许永远是以系统代码页读取 batch 并运行的,也可能是按照当前代码页一次读取一行运行的。考虑如下 UTF-8 的 batch:

chcp 932>nul 2>nul
chcp 65001>nul 2>nul && echo ¿

其中 echo 的字符是 U+00BF ,它的 UTF-8 编码是 0xC2 0xBF ,一开始的 932 是 Windows 的 Shift JIS 实现,在这个代码页里 0xC2 不是合法的开头字节,因此在默认的日语 Windows 上执行它会产生不可预知的后果。

实际效果是打印出来的并不是倒转的问号,而是 ツソ 这两个符号。
220 天前
回复了 lurenn 创建的主题 macOS WPS 创建的文档无法被 one drive 同步?
可能要取消选定 OneDrive 的“让 Office 程序处理 Office 文件的同步”?
220 天前
回复了 polobug 创建的主题 问与答 win11 的 DevDrive 有人体验过吗
@mmdsun ReFS 也不算很新了吧,Windows Server 2012 以来的技术了,而且多数 Windows 程序都采用的是 Win32 ,根本无需关心文件系统是什么。

我记得很久以前(几年前)看过 ReFS 会直接删除损坏的文件,搜索了一下只找到今年的一个版本 https://www.zhihu.com/question/594562714/answer/2975876927 观望中
221 天前
回复了 xJogger 创建的主题 发音 GUI 的三种读法
@geelaw #24 更正一下… gēi wū yī 是更“接地气”的说法,严格来说是 gê wu yi (gê̄ wū yī)。
221 天前
回复了 xJogger 创建的主题 发音 GUI 的三种读法
汉语读法是 gēi wū yī,见拉丁字母的汉语读音规定(即汉语拼音名称音)。
221 天前
回复了 xuelang 创建的主题 C++ C++ 链接符号决议 -- 自以为懂了,结果...
@xuelang #18 汉语“决议”是“会议所确定的较重大的事项”的意思,在计算机技术方面应该理解为复杂的选择过程,比如“重载决议”是可接受的说法,因为要根据形参列表和实参列表从多个可能的选项里根据一系列不那么直接的规则选出最合适的。链接里的 symbol resolution 的 resolution 应该译作“解析”,因为这个过程只是简单地查找符号的定义,不存在复杂的规则。
怎么确定是系统结束了进程,还是进程结束了自己?你试过 try catch 了吗? allDevs.max_size() 是多少?
221 天前
回复了 xuelang 创建的主题 C++ C++ 链接符号决议 -- 自以为懂了,结果...
@xuelang #15 链接并不能用来挑选(“决议”) A 的这个定义或那个定义,A 自始自终都只有一个定义。
1 ... 6  7  8  9  10  11  12  13  14  15 ... 172  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3134 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 48ms · UTC 13:25 · PVG 21:25 · LAX 06:25 · JFK 09:25
Developed with CodeLauncher
♥ Do have faith in what you're doing.