对文件夹中的每个文件运行命令,然后保存输出

时间:2016-12-19 13:39:12

标签: windows powershell csv batch-file

我是编写批处理脚本的新手,希望得到一些帮助。

我有一个图像文件夹。我想逐一将这些图像逐个转换为我在网上制作的图像分类器。然后这会给我一个结果。

然后我想将服务器的响应保存到文件中 - 让我们保持简单,比如说CSV,格式如下:

File, Response

所以我知道在每个文件夹上运行Batch,我可以执行以下操作 -

for /f %%f in ('dir /b c:\') do echo curl -X POST -F "images_file=@%%f" "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key=abcdefgh&version=2016-05-20"*

我知道,我可以使用“>>”以某种方式将结果传输到输出文件中。

我不知道如何将它们放在一起,以及如何在运行批处理脚本时创建CSV。有人可以帮忙吗?我认为我90%只是批处理脚本的新手。

2 个答案:

答案 0 :(得分:0)

你可以在powershell中做这样的事情: 根据您的要求更改占位符。

$dir_files=Get-ChildItem  "C:\"
foreach($file in $dir_files)
{
$result=Invoke-WebRequest 'https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key=abcdefgh&version=2016-05-20' -Method Post -Headers 'images_file=@%%f'
$result | ConvertTo-Csv | Out-File "D:\outputfile.csv" -Append -Force
}

我刚刚给你出发的方式。我没有查看完整的批处理代码。 希望它可以帮到你。

答案 1 :(得分:0)

如果您想使用批处理,可以执行以下操作:

@echo
SetLocal EnableDelayedExpansion
set imagedir=C:\
set csvfile="C:\results.csv"

FOR %%G IN ("%imagedir%*") DO (
    set resultfile=%%G.out
    echo curl -X POST -F "images_file=@%%G" "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key=abcdefgh&version=2016-05-20"* -o "!resultfile!"
    echo %%G, !resultfile! >> %csvfile%
)

EndLocal
exit /b 0

我对curl没有经验,所以我无法验证您的curl命令的正确性,并让echo在它之前。但我知道您实际上可以使用-o标志指定一个文件来将输出写入Windows FOR命令(没有任何标志/选项)是循环遍历目录中文件的另一种方法。如果您仍想使用for /f %%f in ('dir /b ...') do - 样式(可能是因为您希望处理图片的顺序),则只需将行FOR %%G IN ("%imagedir%*") DO (替换为for /f %%f in ('dir /b "%imagedir%"') DO (即可。我将目录保存在变量imagedir中,然后更容易更改。但是如果你改变它,不要忘记最后的\(如果你使用我的for-command)并且不要添加双引号(我将它们添加到FOR中命令)。请注意,这将处理目录中的所有文件。如果需要,您可以指定扩展程序,例如仅使用"%imagedir%\*.jpg" "%imagedir%\*.gif" GIF和JPEG图像。
最后我说我添加了SetLocal EnableDelayedExpansion来使用delayed expansion。实际上只需要它,因为我在变量curl中保存了将保存resultfile操作结果的文件名。在批处理中,FOR -block(FOR ... ( ... ))以及用( )(作为IF - 块)分隔的其他块被解析为单个命令(就像它们一样)写在线)。实际上不可能更改变量的值并在同一命令(或同一行)中读取该新值而不使用某些特殊的"技巧"。延迟扩张就是其中之一。当您对变量使用延迟展开时,请使用!而不是%将其包围。由于resultfile会在每次迭代中发生变化,因此我使用!resultfile!代替%resultfile% 如果您不想将输出文件的名称保存在变量中,则可以删除变量的使用和延迟扩展(也可以删除末尾的EndLocal)。

祝你好运!