使用变量输出到文件名时访问被拒绝

使用变量输出到文件名时访问被拒绝

Windows 10,在 UserProfile 下我自己的 Videos 文件夹中。

我正在尝试将一些东西串在一起,制作一个包含各种信息的完整 txt 文件,在一个命令行中,对吧。

目标是制作一个带有页眉、一些生成的信息和页脚的 txt 文件。.txt为简单起见,txt 文件将以与文件夹名称相同的名称命名。

我的目标是每个文件夹运行一次命令字符串,并且由于对目标文件夹名称的调用相当多,所以我决定使用变量来缩短它。

type header.txt > VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./VeryLongFolderNameFooBar/*.mkv >> VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt & type footer.txt >> VeryLongFolderNameFooBar\VeryLongFolderNameFooBar.txt

这绝对完美地工作,但改变所有出现的文件夹名称变得相当繁琐,所以为什么不使用变量呢?

set a=VeryLongFolderNameFooBar && type header.txt>%a%\%a%.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./%a%/*.mkv>>%a%\%a%.nfo & type footer.txt>>%a%\%a%.txt

这给出了三条access denied消息。最初我在变量调用前后使用了空格,在阅读了一篇帖子说空格会弄乱一切后,我删除了它们,但仍然无济于事,我真的被这个问题难住了。当我这样做时,echo %a%它会返回文件夹名称,没有任何问题。

我错过了什么?

答案1

CMD 在实际处理任何内容之前会扫描整行以查找变量。因此,它会%a%在处理命令之前将其替换为 null(或之前设置的任何值)set a=...。您需要在单独的一行中执行此操作:

set a=VeryLongFolderNameFooBar
type header.txt>%a%\%a%.txt & c:\mediainfo\mediainfo.exe --output=file://template.txt ./%a%/*.mkv>>%a%\%a%.nfo & type footer.txt>>%a%\%a%.txt

但是,此外(正如您所发现的),该set命令(在我看来,这很愚蠢)包括了直到命令分隔符的所有内容。因此

set a=SoLong & echo /%a%/

将设置aSoLong (带有尾随空格)。处理该问题的一种方法是省略 之前的空格&

set a=SoLong& echo ...

但人们普遍认为这种方式可读性较差。一个稍微好一点的解决方案是将命令set放在括号中:

(set a=SoLong) & echo ...

因此值被 终止)

相关内容