我正在编写一个批处理文件,它将取消隐藏并运行另一个批处理文件,或者,如果文件已取消隐藏,它将运行该批处理文件并再次隐藏它。如何检查文件是否被隐藏?
答案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% 之后,其他属性的位置无关紧要。