使用批处理脚本检查文件是否被隐藏

使用批处理脚本检查文件是否被隐藏

我正在编写一个批处理文件,它将取消隐藏并运行另一个批处理文件,或者,如果文件已取消隐藏,它将运行该批处理文件并再次隐藏它。如何检查文件是否被隐藏?

答案1

您可以在 PowerShell 中使用它来获取隐藏文件列表

Get-ChildItem X:\My\Path -Recurse -Force | Where { ($_.Attributes.ToString() -Split ", ") -Contains "Hidden" } | Select FullName

您应该能够dir/ah在当前路径中的 cmd 中使用相同的结果。

答案2

有很多方法。

1)DIR/AH (可能是最简单的方法)

使用 DIR 命令查找具有特定属性的文件。如果找到则返回成功,如果未找到则返回错误。

dir /ah file.ext >nul 2>nul && (
  echo file.ext is hidden
) || (
  echo file.ext is NOT hidden
)

2)ATTRIB命令

属性代码为大写。隐藏的代码为H,我相信它始终位于第五位。使用 FINDSTR 查找代码。

attrib file.ext | findstr "^....H" >nul && (
  echo file.ext is hidden
) || (
  echo file.ext is NOT hidden
)

3)FOR变量~a修饰符

属性代码为小写,且顺序与 ATTRIB 命令不同。隐藏代码位于h第四位。使用 FINDSTR 查找代码。

for %%F in (file.ext) do echo %%~aF | findstr "^...h" >nul 2>nul &&
  echo file.ext is hidden
) || (
  echo file.ext is NOT hidden
)

或者使用子字符串操作。不要忘记子字符串的索引为 0。

for %%F in (file.ext) do set "attr=%%~aF"
if %attr:~3,1% equ h (
  echo file.ext is hidden
) else (
  echo file.ext is NOT hidden
)

4)参数~a修饰符

基本与 FOR 变量相同,只是现在使用脚本或子例程参数。

call :IsHidden file.ext &&
  echo file.ext is hidden
) else (
  echo file.ext is NOT hidden
)
exit /b

:isHidden
echo %~a1 | findstr "^...h" >nul 2>nul
exit /b

或者

call :IsHidden file.ext &&
  echo file.ext is hidden
) else (
  echo file.ext is NOT hidden
)
exit /b

:isHidden
setlocal
set "att=%~a1"
if %att:~3,1% equ h exit /b 0
exit /b 0

答案3

第一个脚本中有一个错误:

dir /ah file.ext >nul 2>nul && (
  echo file.ext is hidden
) || (
  echo file.ext is NOT hidden
)

我用它来检查文件夹是否隐藏,但如果文件夹未隐藏且包含隐藏文件或文件夹,则上述脚本会给出误报(如果您查找任何其他属性,情况也是如此)。第二个脚本似乎运行良好:

attrib file.ext | findstr "^....H" >nul && (
  echo file.ext is hidden
) || (
  echo file.ext is NOT hidden
)

编辑:如果您只想检查文件夹,则将 d 添加到属性:/adh,第一个脚本将为您工作,但我想同时检查文件夹和文件,所以对我来说只有第二个脚本是好的。

编辑2:我修正了第一个脚本:

if exist "PATH"\* (
set "attrD="
) else (
set "attrD=-"
)
dir /a:%attrD%dh "PATH" >nul 2>nul && (
  echo %1 is hidden
) || (
  echo %1 is NOT hidden
)

如果文件夹未隐藏且包含隐藏文件或文件夹,此脚本会将其显示为未隐藏。您必须指定属性 d,并且它必须位于 %attrD% 之后,其他属性的位置无关紧要。

相关内容