我正在编写Windows批处理文件,并希望将某些内容复制到桌面。我想我可以用这个:
%UserProfile%\ Desktop \
但是,我在想,这可能只适用于英语操作系统。有没有办法可以在批处理文件中执行此操作,该文件适用于任何国际化版本?
更新
我尝试了以下批处理文件:
REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop
FOR /F "usebackq tokens=3 skip=4" %%i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F "usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%
得到了这个输出:
S:\>REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders Desktop REG_EXPAND_SZ %USERPROFILE%\Desktop S:\>FOR /F "usebackq tokens=3 skip=4" %i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folder s" /v Desktop`) DO SET DESKTOPDIR=%i S:\>FOR /F "usebackq delims=" %i in (`ECHO ECHO is on.`) DO SET DESKTOPDIR=%i S:\>SET DESKTOPDIR=ECHO is on. S:\>ECHO ECHO is on. ECHO is on.
答案 0 :(得分:55)
为了安全起见,您应该在Powershell(或VBScript)中使用适当的API 使用PowerShell:
[Environment]::GetFolderPath("Desktop")
使用Powershell复制内容:
Copy-Item $home\*.txt ([Environment]::GetFolderPath("Desktop"))
以下是获取桌面路径的VBScript示例:
dim WSHShell, desktop, pathstring, objFSO
set objFSO=CreateObject("Scripting.FileSystemObject")
Set WSHshell = CreateObject("WScript.Shell")
desktop = WSHShell.SpecialFolders("Desktop")
pathstring = objFSO.GetAbsolutePathName(desktop)
WScript.Echo pathstring
答案 1 :(得分:14)
我发现最好的解决方案是将vbscript与批处理文件一起使用。
这是批处理文件:
@ECHO OFF
FOR /F "usebackq delims=" %%i in (`cscript findDesktop.vbs`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%
这是findDesktop.vbs文件:
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
wscript.echo(strDesktop)
可能还有其他解决方案,但我个人认为这个解决方案不那么苛刻。
我在英语PC和法国电脑上测试了它 - 它似乎可以工作(Windows XP)。
HTH,
IulianŞerbănoiu
答案 2 :(得分:14)
KB使用[Environment]::GetFolderPath("Desktop")
的答案显然是执行此操作的官方Windows API。
但是,如果您在提示符处以交互方式工作,或者只是想要在您的计算机上运行某些内容,则tilda(〜)字符将引用当前用户的主文件夹。所以~/desktop
是用户的桌面文件夹。
答案 3 :(得分:14)
至少在Windows XP,Vista和7上,您可以安全地使用"%UserProfile%\Desktop"
。
Windows XP en-US它将扩展为"C:\Documents and Settings\YourName\Desktop"
Windows XP pt-BR它将扩展为"C:\Documents and Settings\YourName\Desktop"
Windows 7 en-US它将扩展为"C:\Users\YourName\Desktop"
Windows 7 pt-BR它将扩展为"C:\Usuarios\YourName\Desktop"
在XP上你不能将它用于桌面上的其他文件夹
My documents
转向Meus Documentos
和Local Settings
转为Configuracoes locais
Personaly我认为投影操作系统时这是一件坏事。
答案 4 :(得分:6)
这不仅不适用于国际版Windows,如果用户编辑了注册表以使其桌面文件夹位于其他位置,则会失败。您可以使用REG
命令在注册表中查询文件位置:
REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop
要将此变为变量,请使用以下内容:
FOR /F "usebackq tokens=3 skip=4" %%i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F "usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%
答案 5 :(得分:4)
您也可以打开DOS命令提示符并执行 set 命令。
这将让您了解系统中可用的环境变量。
E.g。 - 因为你特意要求非英语Windows - 继承人就是我自己的德语版(Window7-64bit)的一个例子:
set > env.txt type env.txt ALLUSERSPROFILE=C:\ProgramData APPDATA=C:\Users\SOF\AppData\Roaming CommonProgramFiles=C:\Program Files\Common Files CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files CommonProgramW6432=C:\Program Files\Common Files COMPUTERNAME=VMSOF ComSpec=C:\Windows\system32\cmd.exe FP_NO_HOST_CHECK=NO HOMEDRIVE=C: HOMEPATH=\Users\SOF LOCALAPPDATA=C:\Users\SOF\AppData\Local LOGONSERVER=\\VMSOF NUMBER_OF_PROCESSORS=2 OS=Windows_NT Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\CMake 2.8\bin;C:\Program Files (x86)\emacs-22.3\bin;C:\Program Files (x86)\GnuWin32\bin; PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC PROCESSOR_ARCHITECTURE=AMD64 PROCESSOR_IDENTIFIER=AMD64 Family 15 Model 67 Stepping 3, AuthenticAMD PROCESSOR_LEVEL=15 PROCESSOR_REVISION=4303 ProgramData=C:\ProgramData ProgramFiles=C:\Program Files ProgramFiles(x86)=C:\Program Files (x86) ProgramW6432=C:\Program Files PROMPT=$P$G PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ PUBLIC=C:\Users\Public SESSIONNAME=Console SystemDrive=C: SystemRoot=C:\Windows TEMP=C:\Users\SOF\AppData\Local\Temp TMP=C:\Users\SOF\AppData\Local\Temp USERDOMAIN=VMSOF USERNAME=SOF USERPROFILE=C:\Users\SOF VBOX_INSTALL_PATH=C:\Program Files\Sun\VirtualBox\ VS90COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\ windir=C:\Windows
答案 6 :(得分:3)
返回桌面路径:
FOR /F "usebackq tokens=3 " %%i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i FOR /F "usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i ECHO %DESKTOPDIR%
答案 7 :(得分:2)
这不是一个解决方案,但我希望它有所帮助:除非当KEY =%userprofile%\ desktop时,即使zdesktop =%userprofile%\ desktop,副本也会失败。我认为因为嵌入的%userprofile%没有被翻译。
REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop>z.out
for /f "tokens=3 skip=4" %%t in (z.out) do set zdesktop=%%t
copy myicon %zdesktop%
set zdesktop=
del z.out
因此它成功地解析了REG键,但如果键包含嵌入的%var%,则在复制命令期间不会翻译它。
答案 8 :(得分:2)
我有类似的问题(并且VBScript或PowerShell不是一个选项),我在本文中找到的代码对我不起作用。我遇到了操作系统版本和语言版本的问题。经过一些实验,我得出了这个解决方案:
for /f "usebackq tokens=2,3*" %%A in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop"`) do if %%A==REG_EXPAND_SZ call :reparse set desktopdir=%%B
echo %desktopdir%
goto :EOF
:reparse
%*
goto :EOF
此代码适用于Windows 7和Windows XP的英语和波兰语版本。
:reparse子程序允许延迟扩展环境变量。
答案 9 :(得分:2)
如果您想使用
from PIL import Image
from flask import Flask, render_template
import datetime
app = Flask(__name__)
@app.route("/")
def hello():
img = Image.new('RGB', (60, 30), color = 'red')
templateData = {
'title' : 'HELLO!',
'image': img
}
return render_template('index.html', **templateData)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80, debug=True)
可以在<!DOCTYPE html>
<head>
<title>{{title}}</title>
</head>
<body>
<h1>Hello, World!</h1>
<img src="{{image}}" alt="not working">
</body>
</html>
中进行操作(感谢Marian Pascalau线程上的MS用户this)
[Environment]::GetFolderPath("Desktop")
答案 10 :(得分:2)
虽然我意识到这是一个较旧的帖子,但我认为这可能会帮助处于类似情况的人。我做了一个快速的一行VBScript来提取您想要的任何特殊文件夹的信息(虽然没有错误检查),它的工作原理如下:
使用以下行创建文件“GetShellFolder.vbs”:
WScript.Echo WScript.CreateObject("WScript.Shell").SpecialFolders(WScript.Arguments(0))
我总是确保将cscript.exe(32位版本)复制到与我运行的批处理文件相同的文件夹中,我将假设您正在执行相同的操作(我曾经遇到过用户以某种方式删除的情况)从他们的路径C:\ Windows \ system32,或设法摆脱cscript.exe,或者它被感染或无效)。
现在将要复制的文件复制到同一文件夹,然后使用以下行创建一个批处理文件:
for /f "delims=" %%i in ('^""%~dp0cscript.exe" "%~dp0GetShellFolder.vbs" "Desktop" //nologo^"') DO SET SHELLDIR=%%i
copy /y "%~dp0<file_to_copy>" "%SHELLDIR%\<file_to_copy>"
在上面的代码中,您可以将“桌面”替换为任何有效的特殊文件夹(收藏夹,StartMenu等 - 完整的官方列表位于https://msdn.microsoft.com/en-us/library/0ea7b5xe%28v=vs.84%29.aspx),当然<file_to_copy>
替换为实际文件你想放在那里。这样可以避免尝试访问注册表(无论如何都无法作为受限用户),并且应该足够简单以适应多个应用程序。
哦,对于那些不知道"%~dp0"
只是调用脚本的目录的人。它也适用于UNC路径,这使得使用它的批处理文件非常便携。这特别以尾随的“\”结尾,但乍一看它看起来有些奇怪。
答案 11 :(得分:1)
TL;DR
%HOMEDRIVE%%HOMEPATH%\Desktop
似乎是最安全的方法。
讨论
关于一个东西在哪个驱动器上的假设在 Windows 中非常脆弱,因为它缺乏一个统一的目录树,挂载将在内部映射到目录。因此,引用 %HOMEDRIVE%
变量很重要,以确保您选择正确的变量(它并不总是 C:\
!)。
非英语语言环境通常会有诸如“桌面”和“图片”之类的本地化名称,但幸运的是它们都是指向 Desktop
的别名,这似乎是底层规范目录名称,无论如何语言环境(我们在日本、泰国、以色列和美国安全地使用它)。
确定 %UserProfile%
是否指向用户的实际个人资料基础目录、他们的桌面或完全不同的地方是一个大怪癖。我不是真正的 Windows 开发人员,但我发现配置文件目录用于设置,但 %HOMEPATH%
用于用户自己的文件,因此它指向导致桌面/下载的目录根目录/图片/等。这往往使 %HOMEDRIVE%%HOMEPATH%\Desktop
成为最安全的方法。
答案 12 :(得分:1)
我使用此代码从注册表中获取用户桌面和公共桌面路径,在Windows XP SP2 pt-PT和Windows 10 b14393 en-US上进行测试,因此它可能适用于Vista / 7/8和其他语言。
:: get user desktop and public desktop paths
for /f "tokens=* delims= " %%a in ('reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop ^|find /i "REG_"') do set "batch_userdesktop=%%a"
for /f "tokens=* delims= " %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Common Desktop" ^|find /i "REG_"') do set "batch_publicdesktop=%%a"
:: remove everything up to and including "_SZ"
set "batch_userdesktop=%batch_userdesktop:*_sz=%"
set "batch_publicdesktop=%batch_publicdesktop:*_sz=%%
:: remove leading spaces and TABs
:loop
if "%batch_userdesktop:~0,1%"==" " set "batch_userdesktop=%batch_userdesktop:~1%" & goto loop
if "%batch_publicdesktop:~0,1%"==" " set "batch_publicdesktop=%batch_publicdesktop:~1%" & goto loop
if "%batch_userdesktop:~0,1%"==" " set "batch_userdesktop=%batch_userdesktop:~1%" & goto loop
if "%batch_publicdesktop:~0,1%"==" " set "batch_publicdesktop=%batch_publicdesktop:~1%" & goto loop
最后两行包含“”中的TAB,一些文本编辑器在您按TAB时添加空格,因此请确保您有一个实际的TAB而不是空格。
我不确定代码是否需要setlocal enabledelayedexpansion,它是我的SETVARS.CMD的一部分,我从其他批次调用来设置常见变量,如cpu架构,帐户语言,Windows版本和Service Pack,用户/公共桌面的路径等等。
答案 13 :(得分:1)
无论Windows的语言版本是什么,无论文件夹位于何处,都可以使用。文件夹路径中是否有空格也无关紧要。
FOR /F "tokens=2*" %%A IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop^|FIND/I "desktop"') DO SET Desktop=%%B
ECHO %Desktop%
对于Windows 2000(可能是NT 4.0),您需要手动将reg.exe复制到%windir%文件夹,因为默认情况下它不可用。
答案 14 :(得分:1)
多语言版本,在日语操作系统上测试
批处理文件
set getdesk=REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop
FOR /f "delims=(=" %%G IN ('%getdesk% ^|find "_SZ"') DO set desktop=%%G
set desktop1=%desktop:*USERPROFILE%\=%
cd "%userprofile%\%desktop1%"
set getdesk=
set desktop1=
set desktop=
答案 15 :(得分:1)
@Dave Webb的回答可能就是要走的路。我唯一能想到的是CSIDLs:
CSIDL_DESKTOPDIRECTORY
用于的文件系统目录 物理存储文件对象 桌面(不应该混淆 与桌面文件夹本身)。一个 典型的路径是C:\ Documents and Settings \用户名\桌面。
我不知道如何从命令行获取它们。
答案 16 :(得分:0)
我知道这是一个古老的话题,但我会使用Powershell变量
$env:UserProfile
要使用它来访问桌面,它将是:
cd $env:UserProfile\desktop
这在Windows 7本地和远程都可以工作。希望这很有用,因为我遇到了一个客户端机器在$ home中没有值的情况。
答案 17 :(得分:0)
相当老的话题。但是我想给我2美分...
我已经稍微修改了tomasz86解决方案,以使用旧样式“ Shell文件夹”而不是“ User Shell文件夹”,因此我不需要扩展envvar%userprofile%
也没有来自powershell / vbscript / etc的依赖关系...
import org.json4s.{CustomSerializer, DefaultFormats, NoTypeHints}
import org.json4s.JsonAST.{JField, JInt, JObject}
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.read
object Json4sExercise {
trait ObjectHolder[T] {
}
case class IntValue(v: Int) extends ObjectHolder[Int]
case class StringValue(v: String) extends ObjectHolder[String]
class IntSerializer extends CustomSerializer[IntValue](format => ( {
case JInt(x) => IntValue(x.toInt)
}, {
case IntValue(x) => JInt(BigInt(x))
}
))
implicit val formats = Serialization.formats(NoTypeHints) + new IntSerializer
def main(args: Array[String]): Unit = {
println(read[Map[String, _]](""" {"price":350} """))
}
}
希望有帮助。