Batch file 为什么cmd无法读取包含与英语不同语言单词的路径?

Batch file 为什么cmd无法读取包含与英语不同语言单词的路径?,batch-file,cmd,Batch File,Cmd,我有此批处理脚本用于在两个文件夹之间复制: xcopy /y "C:\Users\_____\workspace" "D:\Backup_for_project" pause 此处的空行:_____;是我的名字,与英语不同。 cmd无法识别这一点,我得到一个路径不存在的错误 如果路径中的单词仅为英语,则我的脚本有效 如何修复它,使cmd也能识别这个特定的单词?IMO使用%USERPROFILE%是更简单的方法,但要遵循eryksun的提示: @Echo off :: to be lang

我有此批处理脚本用于在两个文件夹之间复制:

xcopy /y "C:\Users\_____\workspace" "D:\Backup_for_project"
pause  
此处的空行:_____;是我的名字,与英语不同。
cmd无法识别这一点,我得到一个路径不存在的错误

如果路径中的单词仅为英语,则我的脚本有效


如何修复它,使cmd也能识别这个特定的单词?

IMO使用
%USERPROFILE%
是更简单的方法,但要遵循eryksun的提示:

@Echo off

:: to be language independent I use two For /F first split : 
:: then trim spacce and possible . (in German for example)
For /F "tokens=2 delims=:" %%A in ('chcp'
) Do For /F "delims=. " %%B in ("%%A") Do set "CP_Current=%%B"

:: to remove UTF16 conversion remnants (cr,cr,lf) of wmic
:: here also a double for is required
For /F %%A in ('wmic os get codeset /value^|find "="'
) Do For /F %%B in ("%%A") Do Set %%B

:: Switch codepage
Echo Switching to codepage %CodeSet%
chcp %CodeSet%

Echo do whatever you like with codepage %CodeSet%
Timeout /T 10

:: Switch back to saved codepage
Echo Switching back to codepage %CP_Current%
chcp %CP_Current%
Timeout /T 10

我很想知道这是否适合你

powershell -NoProfile -Command Copy-Item -Path "$Env:USERPROFILE/workspace" -Destination "D:\Backup_for_project" -Recurse

不如改用
%UserName%
或者先导航到
%UserProfile%”
,然后只使用机器人复制
“工作区”
。XCopy是一个过时的命令,早在Vista.CMD是Unicode应用程序时就被取代了;但是,批处理脚本使用当前控制台代码页逐行解码,该代码页默认为系统区域设置的OEM代码页。如果您在记事本中创建了批处理文件,它可能是使用ANSI代码页保存的。您可以通过
chcp.com
获取当前控制台代码页,并使用
chcp.com[codepage]
设置新的控制台代码页。您可以从wmic os get codeset/value获取ANSI代码页。直接使用
for/f
循环将当前代码页保存为
CP\U current
,将系统ANSI代码页保存为
CP\U ANSI
。然后在xcopy.exe命令之前的行上,您可以切换到ANSI代码页以确保正确解码,并在xcopy命令之后立即切换回上一个代码页。@eryksun No
%%B
包含
代码集=1252
好的,我错过了。我使用
“skip=2 tokens=2 delims==”
而不是使用find.exe编写了不同的测试。您的方式更可靠。仅供参考,wmic.exe仅将UTF-16写入磁盘文件。它将OEM编码的文本写入控制台和管道。这里奇怪的是,它将换行符写为CRLF,因此字符串中保留了一个额外的CR字符。这就是第二个
for/f
循环删除的内容。在我的测试中,我使用了一个子字符串来删除它,而不是第二个循环。@eryksun如果您将wmic输出传输到十六进制查看器,您将看到有
0D 0A
序列(也是可变内容的一部分),第二个堆栈用于删除双
0D
。很抱歉延迟。我检查了情况。我确实责怪wmic.exe——但不是因为错误的字符编码。发生的情况是,wmic调用msvcrt
fprint
,将诸如
“CodeSet=1252\r\n”
之类的字符串写入标准输出。问题是文件以文本模式打开,这意味着CRT将
“\n”
(换行)转换为
“\r\n”
(返回+换行)。wmic出错,因为它传递的字符串格式不正确。