好友
阅读权限10
听众
最后登录1970-1-1
|
[AutoHotKey]艰难自学之:中文文件名带空格造成的一个小小误会
一、前言:
感谢版主和网友的鼓励,今天继续分享我作为一个初学者在编写一个小项目中发现的一个小小问题。
二、问题:
在编写小项目中,其中要在完成一个小功能后播放声音提醒用户。
AutoHotKey中有播放命令SoundPlay,我选取了win10系统目录media中自带的一个声音文件。
结果却出了意想不到的问题。声音文件是“Windows 导航开始.wav”,无论怎么设置都ahk都不播放。
我以为是自己学艺不精或者对该命令的使用没有掌握完全。
于是实验用其他命令操作该文件。找到ahk的文件拷贝命令FileCopy实验,结果拷贝也不成功。
为了验证2个命令没有问题,用了C:\Windows\Media\Windows Notify Email.wav文件实验播放和拷贝,
结果都成功了。难道是ahk命令遇到中文带空格文件名就不支持??
实验过程见下面代码:
[Asm] 纯文本查看 复制代码 ;MsgBox % A_IsUnicode ? "Unicode" : "ANSI"
;MsgBox, % Asc("一")
;MsgBox, % Asc(" ")
;MsgBox, % "a" . chr(32) . "b"
文件名 := % A_WinDir . "\Media\Windows 导航开始.wav"
AttributeString := FileExist(文件名)
AttributeString := FileExist("C:\Windows\Media\Windows 导航开始.wav")
AttributeString := FileExist("C:\Windows\Media\Alarm10.wav")
文件名 := % A_WinDir . "\Media\Windows 导航开始.wav"
SoundPlay, % 文件名 ;提示音
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows" . A_space . "导航开始.wav"
SoundPlay, C:\Windows\Media\Windows%A_space%导航开始.wav
ErrorLevel := 99
文件名 := chr(32) . "导航开始.wav"
SoundPlay, C:\Windows\Media\Windows%文件名%, wait
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows 导航开始.wav"
SoundPlay, C:\Windows\Media\Windows{32}导航开始.wav ,wait
ErrorLevel := 99
FileCopy, C:\Windows\Media\Windows Notify Email.wav, C:\Windows\Media\Windows_Notify_Email.wav;播放成功
ErrorLevel := 99
FileCopy, C:\Windows\Media\Windows Notify Email.wav, s:\Windows_Notify_Email.wav ;成功
ErrorLevel := 99
FileCopy, C:\Windows\Media\Windows 导航开始.wav, C:\Windows\Media\Windows_导航开始.wav ;失败
ErrorLevel := 99
FileCopy, C:\Windows\Media\Windows 导航开始.wav, s:\Windows_111.wav
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows%A_space%导航开始.wav"
SoundPlay, "C:\Windows\Media\Windows 导航开始.wav"
ErrorLevel := 99
文件名 := % A_WinDir . "\Media\Windows" . " " . "导航开始.wav"
SoundPlay, % A_WinDir . "\Media\Windows" . " " . "导航开始.wav"
ErrorLevel := 99
文件名 := % A_WinDir . ("\Media\Windows" . " " . "导航开始.wav")
SoundPlay, % A_WinDir . ("\Media\Windows" . " " . "导航开始.wav")
ErrorLevel := 99
文件名 := % A_WinDir . ("\Media\Windows" . " " . "导航开始.wav")
SoundPlay, %A_WinDir%\Media\Windows 导航开始.wav
;;没有空格没问题
ErrorLevel := 99
文件名 := % A_WinDir . "\Media\Alarm10.wav"
SoundPlay, %文件名% , wait ;播放成功
SoundPlay, 文件名 ;提示音 ;错误表示法
SoundPlay, % 文件名 , wait ;播放成功
;;英文的有空格也没问题
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows Notify Email.wav"
SoundPlay, C:\Windows\Media\Windows Notify Email.wav,wait ;播放成功
SoundPlay, %A_WinDir%\Media\Windows Notify Email.wav,wait ;播放成功
三、解决问题:
经过各种实验没有找到解决的办法怎么办?只好到官方论坛发帖求助。
自己工作环境:
1、我的系统是 windows10--19041中文教育版64位,
2、ahk版本是1.1.33.06的AutoHotkey Unicode 64-bit版,
3、脚本已经是 UTF-8 with BOM.
首先排除了把脚本存为 UTF-8 with BOM 编码试试看 这个问题。
热心网友sanmaodo回复道:
C:\Windows\Media\ 这个文件夹有点奇怪,
比如这个文件: Windows 导航开始.wav ,用 shift+右键 将其复制为路径,
得到的文件名是: Windows Navigation Start.wav,或许,这才是它真实的文件名。
另外,我在其它目录复制文件名是中文且带空格的文件,是成功的。 哈哈,茅塞顿开!确实,改用其英文名称后一切就顺利了。同时也试验了其他中文加空格的文件,确实如您所说那样一切正常!!非常感谢!!!
这个问题的产生可能是微软为适应各种语言代码而作的一个特殊处理吧。
真相大白啦!!
不是ahk对中文文件名带空格支持不够,而是微软对其系统使用的文件做了特殊处理!!
就好比windows系统的我的文档,桌面,用户目录等等很多实际的目录名都是可以用英文路径表示。
明明显示的是比如:C:\Users\某某某\Documents,但实际在资源管理器查看显示目录是“文档”。
只不过没想到微软在文件名上也用了类似手法。
在此记录和分享这一发现,方便其他遇到类似问题的同学可以得到解惑。
[Asm] 纯文本查看 复制代码 ;MsgBox % A_IsUnicode ? "Unicode" : "ANSI"
;MsgBox, % Asc("一")
;MsgBox, % Asc(" ")
;MsgBox, % "a" . chr(32) . "b"
文件名 := % A_WinDir . "\Media\Windows 导航开始.wav"
AttributeString := FileExist(文件名)
AttributeString := FileExist("C:\Windows\Media\Windows 导航开始.wav")
AttributeString := FileExist("C:\Windows\Media\Alarm10.wav")
文件名 := % A_WinDir . "\Media\Windows 导航开始.wav"
SoundPlay, % 文件名 ;提示音
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows" . A_space . "导航开始.wav"
SoundPlay, C:\Windows\Media\Windows%A_space%导航开始.wav
ErrorLevel := 99
文件名 := chr(32) . "导航开始.wav"
SoundPlay, C:\Windows\Media\Windows%文件名%, wait
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows 导航开始.wav"
SoundPlay, C:\Windows\Media\Windows{32}导航开始.wav ,wait
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows 导航开始.wav"
SoundPlay, C:\Windows\Media\Windows Navigation Start.wav ,wait
;;;
;;;文件名竟然是这个!!!英文的文件名!!!实验播放okokokokok
;;;
ErrorLevel := 99
FileCopy, C:\Windows\Media\Windows Notify Email.wav, C:\Windows\Media\Windows_Notify_Email.wav
ErrorLevel := 99
FileCopy, C:\Windows\Media\Windows Notify Email.wav, s:\Windows_Notify_Email.wav
ErrorLevel := 99
FileCopy, C:\Windows\Media\Windows 导航开始.wav, C:\Windows\Media\Windows_导航开始.wav
ErrorLevel := 99
FileCopy, C:\Windows\Media\Windows 导航开始.wav, s:\Windows_111.wav
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows%A_space%导航开始.wav"
SoundPlay, "C:\Windows\Media\Windows 导航开始.wav"
ErrorLevel := 99
文件名 := % A_WinDir . "\Media\Windows" . " " . "导航开始.wav"
SoundPlay, % A_WinDir . "\Media\Windows" . " " . "导航开始.wav"
ErrorLevel := 99
文件名 := % A_WinDir . ("\Media\Windows" . " " . "导航开始.wav")
SoundPlay, % A_WinDir . ("\Media\Windows" . " " . "导航开始.wav")
ErrorLevel := 99
文件名 := % A_WinDir . ("\Media\Windows" . " " . "导航开始.wav")
SoundPlay, %A_WinDir%\Media\Windows 导航开始.wav
;;没有空格没问题
ErrorLevel := 99
文件名 := % A_WinDir . "\Media\Alarm10.wav"
SoundPlay, %文件名% , wait ;提示音
SoundPlay, 文件名 ;提示音 ;错误表示法
SoundPlay, % 文件名 , wait ;提示音
;;英文的有空格也没问题
ErrorLevel := 99
文件名 := "C:\Windows\Media\Windows Notify Email.wav"
SoundPlay, C:\Windows\Media\Windows Notify Email.wav,wait
SoundPlay, %A_WinDir%\Media\Windows Notify Email.wav,wait
FileCopy, s:\haha 哈哈哈.txt, s:\TEMP\0000000\我的 文件 名 就带空格.txt
;复制成功
;;;结论,不是哪种语言文字也不是又没哟空格的问题,而是微软系统文件名有内在的区域语言名称逻辑!!!
Return |
免费评分
-
查看全部评分
|