吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2296|回复: 11
收起左侧

[其他原创] [AutoHotKey]艰难自学之:中文文件名带空格造成的一个小小误会

[复制链接]
laozhhaiJohn 发表于 2021-3-29 10:11
[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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
koitatouko + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| laozhhaiJohn 发表于 2021-3-29 12:31
wffeeff 发表于 2021-3-29 11:39
看语法和AU3完成一样,为啥不转来学AUTOIT ? 大神很多,而且很热心。

这两者一开始都没接触过,也是看了几篇分析2者情况介绍文章,也没有对二者有什么更深了解。但是选用ahk的一个更直接的原因是看到它更新频繁才选的(看au3最新版还是好几年前的)
wffeeff 发表于 2021-3-29 13:19
laozhhaiJohn 发表于 2021-3-29 12:31
这两者一开始都没接触过,也是看了几篇分析2者情况介绍文章,也没有对二者有什么更深了解。但是选用ahk的 ...

其实更不更新频繁不重要,关键在于每天他使用的人,效率因素。当然了,如果bug多早就有人反应了。
相信我,加入au3,我带你起飞。
红蓝黄 发表于 2021-3-29 10:13
威风的黑龙 发表于 2021-3-29 10:20
确实很难,新版本一没汉化、又没教程,我之前还发过一个帖子介绍这款软件, 摆弄了几天自己也放弃了
CkTech 发表于 2021-3-29 11:24
空格的用变量等于双引号,大部分语言都可以的 简语言对这些要求不高但易出错。
wffeeff 发表于 2021-3-29 11:39
看语法和AU3完成一样,为啥不转来学AUTOIT ? 大神很多,而且很热心。
 楼主| laozhhaiJohn 发表于 2021-3-29 12:28
威风的黑龙 发表于 2021-3-29 10:20
确实很难,新版本一没汉化、又没教程,我之前还发过一个帖子介绍这款软件, 摆弄了几天自己也放弃了

我是自娱自乐写一个自己用的小工具,完全自学的,坚持学用1个多月了
secretji 发表于 2021-3-29 14:00
加油吧,一起努力!
 楼主| laozhhaiJohn 发表于 2021-3-29 16:39
wffeeff 发表于 2021-3-29 13:19
其实更不更新频繁不重要,关键在于每天他使用的人,效率因素。当然了,如果bug多早就有人反应了。
相信 ...

感谢推荐!我编完手头自用的一个小程序后,就实验学习au3!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表