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

时间:2019-06-05 03:08:36

标签: windows batch-file

当我使用以下代码运行批处理文件(在USB上)时:

@echo off
cd desktop

    type nul > Test.txt

它在USB而非桌面上创建Test.txt。是否可以在桌面而不是USB上创建Test.txt文件?

4 个答案:

答案 0 :(得分:0)

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

@echo off

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

答案 1 :(得分:0)

%USERPROFILE%\Desktop\Test.txt

答案 2 :(得分:0)

每个用户帐户都有预定义的Windows environment variables。此预定义环境变量之一是USERPROFILE,其中包含用户个人资料目录的路径。

默认情况下,用户桌面目录是Windows注册表中在键%USERPROFILE%\Desktop下定义的HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders,其值Desktop的类型为REG_EXPAND_SZ

还存在一个键HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders,其值也为Desktop,但类型为REG_SZ的键,其用户桌面的文件夹路径已扩展了环境变量引用。

用户可以修改任何shell文件夹(包括桌面文件夹)的文件夹路径,尽管大多数shell文件夹路径均保留默认设置。

因此获取用户桌面文件夹路径的一种安全方法是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "DesktopFolder="
for /F "skip=1 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 for /F "skip=1 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 set "DesktopFolder=%UserProfile%\Desktop"
echo Desktop folder is: "%DesktopFolder%"

endlocal

如果偶然在批处理文件的本地环境中存在环境变量DesktopFolder,则首先将其删除。

接下来,默认情况下查询注册表项Desktop的已扩展注册表值Shell Folders,并且如果具有此注册表值的注册表项与预期的一样为非空字符串,则将文件夹路径分配给环境变量DesktopFolder。为了安全起见,尽管此注册表值应始终为REG_SZ类型,但仍会评估注册表值的类型。

在任何Windows(包括Windows 2000,Windows XP和Windows Server 2003)以及所有较新版本的Windows上,首次注册表查询都不太可能不会成功。但是,如果第一个注册表查询无法确定用户的桌面文件夹,则会在键Desktop下对字符串User Shell Folders的字符串值进行另一个注册表查询,默认情况下类型为REG_EXPAND_SZ。在这种情况下,使用call来扩展环境变量引用,然后再通过对长命令行的最后一部分进行两次解析来将文件夹路径分配给环境变量DesktopFolder

如果两个注册表查询都意外失败,则使用预定义的环境变量DesktopFolder使用默认文件夹路径定义最后一个环境变量UserProfile,以实现近100%的安全性。

最后,环境变量DesktopFolder保留用户桌面文件夹的文件夹路径,直到命令endlocal为止。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

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

阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符>必须在 FOR 命令行上使用脱字符号^进行转义,才能被解释为文字字符。 FOR ,它在以reg(通常是%ComSpec% /c)开始的独立命令过程中在后台执行嵌入式C:\Windows\System32\cmd.exe /c命令行。

答案 3 :(得分:0)

或使用break:

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