Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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
Windows 使用循环变量并行运行命令,同时最多运行N个_Windows_Shell_Command Line_Wget - Fatal编程技术网

Windows 使用循环变量并行运行命令,同时最多运行N个

Windows 使用循环变量并行运行命令,同时最多运行N个,windows,shell,command-line,wget,Windows,Shell,Command Line,Wget,我的服务器上有三千个文件。我可以通过RESTAPI调用一次检索一个。我已经编写了一个命令来检索这些文件。它工作得很好,但是我的登录在大约200次下载后超时 我想并行下载所有这些文件,而不是串行下载。理想情况下,我希望一次检索1-200个文件,同时检索200-400个文件,同时检索400-600个文件……等等 因此,我的尝试是: FOR /L %i in (0,1,200) do wget --no-check-certificate --content-disposition --load-c

我的服务器上有三千个文件。我可以通过RESTAPI调用一次检索一个。我已经编写了一个命令来检索这些文件。它工作得很好,但是我的登录在大约200次下载后超时

我想并行下载所有这些文件,而不是串行下载。理想情况下,我希望一次检索1-200个文件,同时检索200-400个文件,同时检索400-600个文件……等等

因此,我的尝试是:

FOR /L %i in (0,1,200) do wget --no-check-certificate --content-disposition  --load-cookies cookies.txt \ -p https://username:password@website.APICall.com/download/%i
如何将其转换为要创建的并行调用

谢谢。

我怀疑您的命令是否有效,因为据我所知,迭代器变量需要一个双百分比,即
%I
需要是
%I

关于并行化,您可以尝试以下方法:

FOR /L %%i IN (0,1,200) DO ( 
    start wget --no-check-certificate --content-disposition --load-cookies cookies.txt -p "https://username:password@website.APICall.com/download/%%i"
)
对于您的前200次下载,它将为每次下载生成一个单独的进程(和shell窗口!)。这样做会在服务器上造成大量负载,我不确定这是否真的是前进的方向。但它能满足你的要求


编辑:上述注释适用于在
.bat
文件中使用命令,如果您直接在shell上执行此命令,一个百分比就足够了。

安装Cygwin和GNU Parallel后,您可以下载3000个文件,其中200个并行下载持续运行,使用:

seq 3000 | parallel -j 200 wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/{}

不要经历Cygwin的麻烦;试图将Windows转换为UNIX会使问题更加复杂,并增加依赖关系层。使用PowerShell

如果您可以在超时前下载200个文件,请将其分为三个作业:

invoke-command -asjob -scriptblock {$files = @(1..200);$files | foreach-object{ & wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/$_}};
invoke-command -asjob -scriptblock {$files = @(201..400);$files | foreach-object{ & wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/$_}};
invoke-command -asjob -scriptblock {$files = @(601..400);$files | foreach-object{ & wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/$_}};
或者像这样获取并使用它:

$filenames = @(1..600);    
invoke-parallel -InputObject $servers -throttle 200 -runspaceTimeout 30 -ScriptBlock { & wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/$_}
另一个(可能是最好的)选择是使用,但我不知道它是否能满足您的cookie需求

免责声明:由于目前无法访问Windows或您的URL,因此使用内存工作。

另一种选择是使用
-p
选项的良好ol'
xargs

$ seq 3000 | xargs -i '{}' -n 1 -P 200 wget <url_start>{}<url_end>
$seq 3000 | xargs-i'{}'-n1-p200 wget{}

Windows部件可能会让一切变得有点棘手,GNU parallel可能会帮到你:非常感谢你的建议。这里的大括号代表什么?谢谢。{}是GNU Parallel的默认替换字符串-类似于您的%i。非常感谢。我以为是这样的,只是希望得到澄清。谢谢。你也可以为这个相关问题提供一些见解-。非常感谢:).@Adrian据我所知没有,但是如果您有gpg、wget、perl和make:(wget-O-pi.dk/3 | curl-pi.dk/3/| fetch-O-| bash,这个程序将安装它