Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 用于删除除图像文件扩展名以外的所有内容的Windows脚本_Powershell_Batch File - Fatal编程技术网

Powershell 用于删除除图像文件扩展名以外的所有内容的Windows脚本

Powershell 用于删除除图像文件扩展名以外的所有内容的Windows脚本,powershell,batch-file,Powershell,Batch File,我想在Windows7上创建一个脚本,删除目录中不是图片的所有内容。 所以 就这样 如何找到或创建这样的脚本 请注意,有些图片很重要,所以这个脚本必须正确工作:)我认为我不应该在这里进行实验,即使我用实验文件在一个小目录上测试了我自己的脚本,我也不相信我应该尝试它 我建议使用以下代码: ::extensions are delimited with space // filename is del_stuff.bat set "extensions_list=.png .gif .jpeg .

我想在Windows7上创建一个脚本,删除目录中不是图片的所有内容。 所以

就这样

如何找到或创建这样的脚本

请注意,有些图片很重要,所以这个脚本必须正确工作:)我认为我不应该在这里进行实验,即使我用实验文件在一个小目录上测试了我自己的脚本,我也不相信我应该尝试它

我建议使用以下代码:

::extensions are delimited with space // filename is del_stuff.bat

set "extensions_list=.png .gif .jpeg .bmp .jpg "
pushd "C:\Users\denman\Desktop\xxx\"
for /f "delims=" %%f in ('dir /b ^|findstr /i /e /v "%extensions_list%" ') do (
        echo del /q /f "%%~f" 
)
popd
但我得到了这个错误:

@echo off
::extensions are delimited with space
set "extensions_list=.png .gif .jpeg "
pushd "C:\Directory_with_pictures" && (
   for /f "delims=" %%f in ('dir /b /a-d ^|findstr /i /e /v "%extensions_list%" ') do (
        echo del /q /f "%%~f"
   )
  popd
)

“echo”用于验证结果。删除echo以激活删除。并用实际路径更改
“C:\Directory\u with_pictures”

编辑测试脚本:

@echo off

md test_dir>nul 2>&1
echo #>test_dir\t1.png
echo #>test_dir\t1.txt
echo #>test_dir\t1.tst
echo #>test_dir\t1.jpg
echo #>test_dir\t1.gif

echo #>test_dir\t2.png
echo #>test_dir\t2.txt
echo #>test_dir\t2.tst
echo #>test_dir\t2.jpg
echo #>test_dir\t2.gif

echo -- before deleting--
dir /b .\test_dir\*
echo(
echo(

::extensions are delimited with space
set "extensions_list=.png .gif .jpeg .jpg"


pushd "test_dir"
for /f "delims=" %%f in ('dir /b ^|findstr /i /e /v "%extensions_list%" ') do (
        del /q /f "%%~f"
)
popd

echo -- after deleting --
dir /b .\test_dir\*
输出:

-- before deleting--
t1.gif
t1.jpg
t1.png
t1.tst
t1.txt
t2.gif
t2.jpg
t2.png
t2.tst
t2.txt


-- after deleting --
t1.gif
t1.jpg
t1.png
t2.gif
t2.jpg
t2.png

使用Powershell,您可以通过以下方式获得所需文件的列表:

Get-ChildItem | where {!$_.PsIsContainer -and !(@(".png",".gif",".jpeg") -contains $_.Extension) }

我将命令留给了您,请确保列表在执行之前返回正确的结果。

如果您已经有了脚本,请随意分享。此外,千万不要假设一个程序将100%工作,没有问题。事实上,总是假设一次最终的失败,你以后会少失望就PowerShell而言,Remove Item是您想要的cmdlet,它的天才之处在于有一个-WhatIf开关,它将简单地将发生的事情输出到屏幕上,而不是实际删除任何内容,因此只要您使用-WhatIf开关,就可以完全安全地使用它。试试看,如果你遇到麻烦就回来。我相信,如果您遇到错误并需要一些指导,我们可以提供帮助。问题应该包括您尝试过的代码和遇到的问题。要求我们为您编写脚本的问题与主题无关。仅供参考,除了.png.gif.jpeg之外,还有更多图片扩展名。你也有.jpg.bmp,显然还有很多其他文件,所以要小心处理。如果我们要给他一个答案,为什么不
GCI'C:\Path\to\Files\*'-包括'*.png','*.gif','*.jpeg'
,让提供者为他过滤?如果你有很多文件,速度会快得多。@TheMadTechnician:展示Powershell的真正威力!说真的,我的powershell已经生锈了,但这就是我之前在脚本中所做的。以上内容主要展示了
.PsIsContainer
的使用。也可以将你的答案贴出来。我们不支持codegolf,但我会将其视为目前为止最短的解决方案现在我想起来了,我的建议与他想要的正好相反。
-Include
应该是
-Exclude
。除此之外,它不返回目录,所以您甚至不需要检查.psiscontenar,并且可以直接将管道导入删除项。@TheMadTechnician:是的,我明白您的意思。这似乎不起作用,我把一个.txt文件和一个.png文件放在一个目录中,也没有被删除:/@AlexMills-检查我的编辑。脚本按预期工作。只添加了
/q/f
切换到del命令。请确保为
pushd
命令键入正确的文件夹名称。添加
pause
作为最后一行,以便您也可以阅读屏幕。在findstr行中添加“/c:”的小建议。更改为“findstr/i/e/v/c:“%extensions_list%”,这样它就不会忽略前导点。@RyanBemrose-如果我使用
/c:
选项,空格将不会被用作分隔符,findstr将查找要排除的整个字符串。
Get-ChildItem | where {!$_.PsIsContainer -and !(@(".png",".gif",".jpeg") -contains $_.Extension) }