将用于IPFS固定的Bash xargs命令转换为Windows PowerShell命令
Windows PowerShell中批量IPFS固定CID的解决方案
有一个文本文件,每行包含文件描述和对应的IPFS CID,格式如下:
"description of a file" "IPFS CID" description1 CID1.....shnpnhzuquz3ho7vvabqjyide description2 CID2.....keg4rklbzenppnyrjk554h5ru
Linux下可以用以下命令批量固定每行对应的CID:
cat file.txt | xargs -L1 bash -c 'ipfs pin add $1'
在Windows PowerShell中尝试了以下命令:
cat file.txt | %{ipfs pin add $_}
但出现错误:
Error: invalid path "description1 CID1.....shnpnhzuquz3ho7vvabqjyide": selected encoding not supported Error: invalid path "description2 CID2.....keg4rklbzenppnyrjk554h5ru": selected encoding not supported
问题原因
你之前的命令把**整行内容(描述+CID)**作为参数传给了ipfs pin add,但这个命令只需要单独的CID,整行包含的描述文本导致被识别为无效路径,因此报错。
解决方案
根据文本文件的两种格式(带引号的描述/不带引号的描述),提供两种处理方式:
1. 处理不带引号的行(描述无空格)
如果每行的描述和CID仅用空格分隔,且描述本身不含空格,直接分割行内容取最后一个元素(即CID):
Get-Content file.txt | ForEach-Object { # 按任意空白字符分割行,取最后一段作为CID $cid = ($_ -split '\s+')[-1] ipfs pin add $cid }
2. 兼容带引号的行(描述含空格)
如果存在带引号的描述行(如第一行格式),用正则匹配提取引号内的CID,同时兼容不带引号的行:
Get-Content file.txt | ForEach-Object { if ($_ -match '"[^"]+"\s+"([^"]+)"') { # 匹配带双引号的行,提取第二个引号内的CID $cid = $matches[1] } else { # 处理不带引号的行,取最后一段 $cid = ($_ -split '\s+')[-1] } ipfs pin add $cid }
说明
Get-Content是PowerShell中读取文件的标准命令(cat是它的别名)ForEach-Object(别名%)用于遍历每行内容-split '\s+'会将行内容按任意数量的空白字符分割成数组- 正则表达式
"[^"]+"\s+"([^"]+)"专门匹配"描述" "CID"格式的行,捕获组([^"]+)提取出CID
内容的提问来源于stack exchange,提问作者valen320
相关产品推荐
相关产品推荐

