CMD - 将 cd 命令输出重定向到新文件

CMD - redirect cd command output into new file

是否可以将 cd 命令 输出 重定向到新文件这里是 C:\ 分区

中的路径列表
C:\Inetpub\vhosts\apnat\httpdocs
C:\Inetpub\vhosts\interline\httpdocs
C:\Inetpub\vhosts\dentin\httpdocs
C:\Inetpub\vhosts\archm\httpdocs
C:\Inetpub\vhosts\archacom\httpdocs
C:\Inetpub\vhosts\arowmom\httpdocs
C:\Inetpub\vhosts\myrin\httpdocs
...

有些路径是可以打开的,没有错误,有些路径不是 拒绝访问错误我正在尝试将所有可打开的路径保存到新文件中并尝试使用此命令

for /f %x in (paths.txt) do cd %x | echo %cd%>>C:\users\vb3\results.txt
for /f %x in (paths.txt) do (cd %x & echo %cd%>>C:\users\vb3\results.txt)

我正在尝试使用这些命令,但输出文件为空或填充了同一行

C:\Windows\SysWOW64\inetsrv
C:\Windows\SysWOW64\inetsrv
C:\Windows\SysWOW64\inetsrv
C:\Windows\SysWOW64\inetsrv
...
...

您有一个 (这导致 %cd% 对于每个 运行 都是相同的值)。

但是当你使用条件执行时你并不真正需要它:

for /f "delims=" %x in (paths.txt) do cd "%x" 2>nul && echo %x >> "C:\users\vb3\results.txt"

逐行写入文件很慢(因为必须打开文件,读取文件直到文件末尾,写入,然后关闭每一行(你可能不会注意到它只是几行,但有几千行,它是巨大的(我们说的是 1000 倍甚至更多)。最好一次重定向整个输出(简而言之:(loop with many echoes here)>file.txt 而不是 loop with many "echo>>file.txt" )

(for /f "delims=" %x in (paths.txt) do cd "%x" 2>nul && echo %x)>"C:\users\vb3\results.txt"

&& 用作“如果先前的命令 (cd ...) 成功,则”。

如果你需要相反的,使用||(“如果之前的命令失败,那么”):

(for /f "delims=" %x in (paths.txt) do cd "%x" 2>nul || echo %x>"C:\users\vb3\denied.txt")

2>nul 将任何错误消息 (access is denied) 重定向到“必杀技”(抑制它们)
delims= 处理整行(没有它,它只会输出第一个单词)。当文件名或文件夹名中有空格时必不可少。

使用 PowerShell 的另一种方法。也许更容易理解和维护。

$ResultsFile = 'C:\users\vb3\results.txt'
if (Test-Path -Path $ResultsFile) { Remove-Item -Path $ResultsFile }
Get-Content -Path '.\paths.txt' |
    ForEach-Object {
        if ((Test-Path -Path $_) -and (Get-ChildItem -Path $_ -ErrorAction SilentlyContinue)) {
            Out-File -FilePath $ResultsFile -Encoding ascii -Append -InputObject $_
        }
    }