windows 无法使用USB上的批处理文件在桌面上创建空白.txt文件

uqxowvwt  于 2023-11-21  发布在  Windows
关注(0)|答案(4)|浏览(165)

当我运行批处理文件(在usb上)与此代码:

@echo off
cd desktop

    type nul > Test.txt

字符串
它在USB上而不是在桌面上创建Test.txt。有没有可能在桌面上而不是USB上创建Test.txt文件?

dvtswwa3

dvtswwa31#

%USERPROFILE%\Desktop\Test.txt

字符串

am46iovg

am46iovg2#

每个用户帐户都有预定义的Windows环境变量。其中一个预定义的环境变量是USERPROFILE,包含用户配置文件目录的路径。
默认情况下,用户桌面的目录是%USERPROFILE%\Desktop,如Windows注册表中HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders项下定义的,值为REG_EXPAND_SZDesktop
还有一个值为Desktop的键HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders,但类型为REG_SZ,文件夹路径为用户桌面,环境变量引用已展开。
用户可以修改任何shell文件夹的文件夹路径,包括桌面文件夹,尽管大多数shell文件夹路径都是默认定义的。
所以一个安全的方法来获取用户的桌面文件夹的路径是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "DesktopFolder="
for /F "skip=2 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder for /F "skip=2 tokens=1,2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop 2^>nul') do if /I "%%I" == "Desktop" if not "%%~K" == "" if "%%J" == "REG_SZ" (set "DesktopFolder=%%~K") else if "%%J" == "REG_EXPAND_SZ" call set "DesktopFolder=%%~K"
if not defined DesktopFolder set "DesktopFolder=\"
if "%DesktopFolder:~-1%" == "\" set "DesktopFolder=%DesktopFolder:~0,-1%"
if not defined DesktopFolder set "DesktopFolder=%UserProfile%\Desktop"

echo Desktop folder is: "%DesktopFolder%"

endlocal

字符串
如果环境变量DesktopFolder偶然存在于批处理文件的本地环境中,则首先删除该环境变量。
接下来,默认情况下,查询注册表项User Shell Folders的未扩展注册表值Desktop,如果具有此注册表值的注册表项存在,并且如预期的那样具有非空字符串,将文件夹路径分配给环境变量DesktopFolder展开。在这种情况下,call用于在将文件夹路径分配给环境变量之前展开环境变量引用DesktopFolder通过双重解析长命令行的最后一部分。为了安全起见,还评估了注册表值的类型,尽管此注册表值应始终为REG_EXPAND_SZ类型。
这是非常不可能的,第一个注册表查询是不成功的任何Windows,包括Windows 2000,Windows XP和Windows Server 2003,当然所有较新版本的Windows。但如果第一个注册表查询未能确定用户的桌面文件夹,对键Shell Folders下的Desktop的字符串值进行另一个注册表查询,该键默认为类型REG_SZ,这意味着注册表值保存已经扩展的目录路径。
最后,如果两个注册表查询都意外失败,则使用预定义的环境变量UserProfile使用默认文件夹路径定义环境变量DesktopFolder,以实现近100%的安全性。
最后,环境变量DesktopFolder保存用户桌面文件夹的文件夹路径,直到命令endlocal行。
确定Desktop目录路径的顺序与Windows本身使用的完全相同,如果Desktop注册表值根本不存在,则错误处理相同,这是非常不可能的,但根据我的测试,在各种测试用例中手动删除一个或两个注册表值,暂时是可能的。
为了理解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • reg /?reg query /?
  • set /?
  • setlocal /?

有关2>nul的解释,请阅读Microsoft有关using command redirection operators的文章。在执行命令FOR之前,Windows命令解释器处理FOR命令行时,重定向运算符>必须使用插入字符^进行转义,以将其解释为文字字符它使用在后台用%ComSpec% /c启动的单独命令进程来执行嵌入式reg命令行,这意味着通常用C:\Windows\System32\cmd.exe /c

xqnpmsa8

xqnpmsa83#

尝试在输出行中将完整路径指定为:

@echo off

    type nul > path\to\desktop\Test.txt

字符串

qlvxas9a

qlvxas9a4#

或者使用break:

break>"%userprofile%\desktop\Test.txt"

字符串

相关问题