Powershell 用于在文件夹中查找空文件的批处理脚本

Powershell 用于在文件夹中查找空文件的批处理脚本,powershell,batch-file,cmd,Powershell,Batch File,Cmd,我需要在文件夹中标识一个零KB的文件,并将输出写入文本文件。下面是我通过使用批处理脚本找到的代码,我想根据我下面的要求定制相同的代码 @echo off set out=found.txt (for /r c:\myfolderfilestosearch %%F in (*.txt) do (if %%~zF LSS 1 echo %%F)) > %out% pause 实际上,我想创建并将结果写入文件当且仅当上述文件夹仅包含任何0kb文件时,但我的上述脚本会为每个实例创建一个txt文件

我需要在文件夹中标识一个零KB的文件,并将输出写入文本文件。下面是我通过使用批处理脚本找到的代码,我想根据我下面的要求定制相同的代码

@echo off
set out=found.txt
(for /r c:\myfolderfilestosearch %%F in (*.txt) do (if %%~zF LSS 1 echo %%F)) > %out%
pause
实际上,我想创建并将结果写入文件当且仅当上述文件夹仅包含任何0kb文件时,但我的上述脚本会为每个实例创建一个txt文件,即使没有0kb文件

我认为我们可以通过使用if else来实现它,但正如我所说的,我是新手,如果有人用脚本来指导,我会非常感激


另外,我也很乐意在powershell中编写脚本。谢谢。

您有太多不必要的参数,不需要
/r
。这在我的机器上工作:

@echo off
set out=found.txt
for %%F in (c:\myfolderfilestosearch\*.*) do if %%~zF LSS 1 echo %%F >> %out%
pause
请注意,如果没有为found.txt指定特定的文件夹位置,它将位于批处理文件本身所在的任何文件夹中。如果您不希望这样做,请指定该文件的路径,或使用批处理文件中的
cd
将其更改为该文件夹:

@echo off
cd /d "C:\myfolderfilestosearch"
set out=found.txt
for %%F in (*.*) do if %%~zF LSS 1 echo %%F >> %out%
pause


编辑:使用
>
附加到输出文件。

问题是:如果您实际正在写入数据,重定向并不重要。它正在创建文件。但是,如果它的大小为零(没有写入数据),您可以在以后将其删除

(我更喜欢
==0
eq 0
而不是
lss

PowerShell

Get-ChildItem -Path C:\myfolderfilestsearch -Recurse -Force | Where-Object { $_.PSIsContainer -eq $false -and $_.Length -eq 0 } | Select -ExpandProperty FullName | Add-Content -Path found.txt
要为每次运行重新创建输出文件,请执行以下操作:

(Get-ChildItem -Path C:\myfolderfilestsearch -Recurse -Force | Where-Object { $_.PSIsContainer -eq $false -and $_.Length -eq 0 } | Select -ExpandProperty FullName) | Set-Content -Path found.txt

批量收集输出并延迟“写入文件”部分并不是那么简单。不管怎样,都可以将输出写入文件,如果遇到大小非零的文件,则可以删除该文件

@echo off

set "out=found.txt"
set "allzero=y"

(for /r C:\myfolderfilestosearch %%F in (*.*) do (
  if %%~zF gtr 0 (
    set "allzero=n"
    goto :done
  )
  echo %%F
))>"%out%"

:done
if "%allzero%"=="n" del /q "%out%"
在PowerShell中,您可以这样做:

$allzero = $true
$files = Get-ChildItem C:\myfolderfilestosearch -File -Recurse -Force |
         ForEach-Object {
           if ($_.Length -gt 0) {
             $allzero = $false
             continue
           }
           $_.FullName
         }

if ($allzero) {
  $files | Set-Content 'found.txt'
}

@乔伊,谢谢你编辑这篇文章乔伊<代码>对于%%a in(%out%)如果%%za==0 del%out%(我将使用
==0
eq 0
而不是
lss 1
)只在文件夹中有一些大小为0kb的文件,或者如果文件夹中只有0kb的文件而没有其他文件,则要写入结果吗?“批处理脚本,批处理脚本的新功能,这是我的批处理脚本”-标记[powershell]?@TessellatingHeckler您好,是的,我只想在文件夹中的任何文件包含0kb大小且文件夹中可以有“n”个不同大小的文件时,才将输出写入文件,但是如果有任何文件大小为0kb,我有兴趣编写该文件。更准确地说,我正在从批处理脚本或powershell脚本中寻找这个解决方案,任何东西都可以满足。希望我能回答,“结果”是什么?它是每个目录中第一个空文件的路径/名称,还是应该是相应的目录路径/名称?实际上,完整的
for
循环中的偏旁主题是必要的,以避免每次查找都覆盖输出文件。@Ken White感谢您写了上述内容,但实际上,我正在寻找一个脚本,在这个脚本中,我想将结果写入found.txt文件,当且仅当上述文件夹仅包含任何0kb文件时。根据上面的脚本,它看起来像是每次执行批处理时都会写入文件。如果我遗漏了什么,请告诉我。不要使用附加的
>
。我应该直接提到这一变化,使其更加明显。(感谢@LotPings添加了它。)@MGM:No,如果找到零字节文件,它只添加零字节文件。如果找不到大小为0字节的文件,则不会写入任何内容。(我已经测试了两种方法。)如果需要清理上次运行创建的文件,请在批处理文件的顶部将其删除。@KenWhite是的,上面的说法是正确的,但即使在文件夹中没有0kb的文件后,也会创建一个文件。我希望如果文件夹中有任何0kb文件,则不应创建found.txt文件,并且只有当文件夹中有任何0kb文件时,才应创建和写入found.txt文件。希望我现在明白了。上面的内容很有用,工作正常,但是当我重新运行powershell脚本时,我可以看到数据被复制。相反,是否可以在每次重新运行powershell脚本时重新创建该文件?已用示例更新。添加括号是为了使括号内的一组命令生成的所有数据只传递给
set Content
一次。将
添加内容
替换为
设置内容
@echo off

set "out=found.txt"
set "allzero=y"

(for /r C:\myfolderfilestosearch %%F in (*.*) do (
  if %%~zF gtr 0 (
    set "allzero=n"
    goto :done
  )
  echo %%F
))>"%out%"

:done
if "%allzero%"=="n" del /q "%out%"
$allzero = $true
$files = Get-ChildItem C:\myfolderfilestosearch -File -Recurse -Force |
         ForEach-Object {
           if ($_.Length -gt 0) {
             $allzero = $false
             continue
           }
           $_.FullName
         }

if ($allzero) {
  $files | Set-Content 'found.txt'
}