gpt4 book ai didi

windows - 如何将命令的输出重定向到在环境变量中定义了名称的文件?

转载 作者:可可西里 更新时间:2023-11-01 10:14:06 29 4
gpt4 key购买 nike

我想将文件夹下所有文件的绝对路径存储到一个文本文件中,比方说 temp.txt

我正在使用这个命令来完成这个任务:

dir /s/b/a-d > D:\my work\temp.txt

当我重定向到一个硬编码到批处理文件中的文件名时,上面的命令工作正常。

但是当我使用如下代码所示的变量时,我没有将输出重定向到文件 temp.txt

@echo off
setlocal enabledelayedexpansion
REM I am running this script from D:\my work\
set origDir= %cd%
cd C:\
set temporaryFile="!origDir!\temp.txt"
dir /s/b/a-d > !temporaryFile!

为什么 DIR 的输出没有写入 D:\my work\temp.txt

最佳答案

Why is no string output with 'echo %var%' after using 'set var = text' on command line? 上的答案 what is wrong on command line:

set origDir= %cd%

命令SET 不会忽略等号后的空格。因此,环境变量 origDir 的字符串值是用一个前导空格字符定义的。

接下来是命令行

set temporaryFile="!origDir!\temp.txt"

在字符串 "D:\my work\temp.txt" 中,双引号被分配给环境变量 temporaryFile

所以用双引号括起路径的文件名是无效的,因为以空格字符开头。

您的任务的可能代码是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "origDir=%CD%"

rem Current directory path usually does not end with a backslash. But on
rem current directory being root of a drive it ends with a backslash which
rem should be removed to correct concatenate it with backslash and file name.

if "%origDir:~-1%" == "\" set "origDir=%origDir:~0,-1%"
set "temporaryFile=%origDir%\temp.txt"
cd /D C:\
dir /A-D /B /S >"%temporaryFile%"
endlocal

这里不需要延迟环境变量扩展的使用。

命令 CD 将当前目录更改为与当前驱动器不同的驱动器上的指定目录,仅当参数 /D 也被使用且指定目录不在当前驱动器上时使用 UNC 路径引用的网络共享。

启用命令扩展的命令 PUSHD 也适用于 UNC 路径,使用 POPD 可以恢复初始当前目录。

好吧,命令ENDLOCAL 还可以在上面的批处理文件中恢复初始当前目录。这可以在命令提示符窗口中运行此批处理文件时看到,D:\my work 是当前目录。 echo %CD% 在运行批处理文件输出 D:\my work 后执行,尽管批处理文件更改为驱动器 C: 的根目录。阅读 this answer 以了解有关命令 SETLOCALENDLOCAL 的详细信息。

也可以但不推荐:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "origDir=%CD%"
if "%origDir:~-1%" == "\" set "origDir=%origDir:~0,-1%"
set "temporaryFile="%origDir%\temp.txt""
cd /D C:\
dir /A-D /B /S >%temporaryFile%
endlocal

环境变量 temporaryFile 保存的文件名的完整路径已经用双引号括起来,因此 DIR 命令行在 Windows 命令解释器预处理后执行为:

dir /A-D /B /S  1>"D:\my work\temp.txt"

一般来说,不建议将已经用双引号引起来的文件夹或文件名分配给环境变量,因为如果稍后在批处理代码中将变量值与其他字符串连接起来,这很容易导致意外行为,请参见示例How to set environment variables with spaces?

但是这个任务的最短版本是单个命令行:

@dir C:\* /A-D /B /S >temp.txt

该单个命令行与包含上述所有命令的两个批处理文件完全相同。它在当前目录 D:\my work 中创建一个文件 temp.txt,其中包含整个驱动器 C: 上所有文件的名称以及完整路径当前用户帐户有权列出目录条目。

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

  • cd/?
  • dir/?
  • echo/?
  • endlocal/?
  • 如果/?
  • rem/?
  • 设置/?
  • setlocal/?

另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章。

关于windows - 如何将命令的输出重定向到在环境变量中定义了名称的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47094912/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com