我经常将 PDF 的标题粘贴到文件名中,以便轻松搜索。它们通常包含换行符或 等无效字符:
,Windows 会弹出一个愚蠢的错误,然后将文件名恢复为原始名称:
我不在乎这些字符,如果能用它们替换-
或完全删除它们,我会非常高兴。有什么方法可以做到这一点?有没有什么系统设置可以禁用此提示?
我能想到的最好的办法是使用 AutoHotkey 脚本,它有自己的键盘快捷键,用于“粘贴剪贴板但先删除无效字符”,这也是我目前正在使用的。
答案1
我确实会在需要时激活此 ahk 代码。ctrl+alt+shift+g(或您选择的任何内容)将自动复制并用下划线(或您想要的任何内容)替换禁用字符。(您实际上不需要完全理解它就可以对其进行自定义)。
!^+g:: ; Alt(!) CTRL(^) shift(+) G ---------------- replace \? <>/\\\*""|: by _
clipboard = ; empty clipboard
Send, {CTRLDOWN}c{CTRLUP}{ESC} ; send the ctrl C command to copy text in clipboard
ClipWait ; wait until there is something in clip bord
Removesign := RegExReplace(clipboard, "[\? <>/\\\*""|:]", "_") ; run the regex on the clipboard content and save it in Removesign
clipboard = %Removesign% ; send Removesign to clipboard
ClipWait
return
答案2
12 年后,这个问题仍然存在于 Windows 10 和 Windows 11 上。既然不可能,我们为什么要在文件名中粘贴带有格式的文本?我很困惑,为什么他们不默认在文件资源管理器中的文件名字段中粘贴时从剪贴板中删除任何格式……
但现在有一个调整Windows PowerToys称为粘贴为纯文本您可以在其中指定快捷方式来粘贴不带格式的文本。
PowerToys 粘贴为纯文本功能可让您使用快捷键粘贴剪贴板中存储的文本(不包括任何文本格式)。剪贴板文本中包含的任何格式都将被替换为未格式化的文本版本。
答案3
答案4
我一直在使用此 AutoHotkey 键盘快捷键,虽然可以正常工作,但不是“自动”的:
;------------------------------------------------------------------------------
; Win+V: Paste as plain text from clipboard
;------------------------------------------------------------------------------
#v::
Clip0 = %ClipBoardAll%
ClipBoard = %ClipBoard% ; Convert to plain text
Send ^v ; For best compatibility: SendPlay
Sleep 50 ; Don't change clipboard while it is pasted! (Sleep > 0)
ClipBoard = %Clip0% ; Restore original ClipBoard
VarSetCapacity(Clip0, 0) ; Free memory
Return
;------------------------------------------------------------------------------
; Win+Alt+V: Paste plain text only, stripping characters unsafe for filenames
;------------------------------------------------------------------------------
#!v:: ; paste without formatting
StringReplace, clipboardt, clipboard, `r`n, %A_Space%, All
clipboardt := RegExReplace(clipboardt, "` {2,}", "` ")
StringLeft, 1st, clipboardt, 1
IfInString, 1st, %A_Space%
StringTrimLeft, clipboardt, clipboardt, 1
StringRIght, last, clipboardt, 1
IfInString, last, %A_Space%
StringTrimRight, clipboardt, clipboardt, 1
;Send {Raw}%clipboardt%
Clip0 = %ClipBoardAll%
ClipBoard = %clipboardt% ; Convert to plain text
Send ^v ; For best compatibility: SendPlay
Sleep 50 ; Don't change clipboard while it is pasted! (Sleep > 0)
ClipBoard = %Clip0% ; Restore original ClipBoard
VarSetCapacity(Clip0, 0) ; Free memory
clipboardt =
return