我对脚本编写很陌生,我一直被这个问题卡住了。
我想提取一个zip文件,在这个zip文件中有一个名为file.xml的xml文件,我需要从中提取信息
文件很大,我只需要在两个标签之间提取信息。
<Report name="result_many fail" summary="20" yes=19 no="1" finished=20>
我需要提取标签名称和完成之间的信息,并将其保存到一个txt文件。这个txt文件应该是这样的:
name result_many fail, summary 20, yes 19 , no 1, finished 20
问题是,它解压缩到正确的目标文件夹,但它不保存任何东西到result.txt文件。我的txt文件总是空的。
这是我的代码:
echo "unzipping file..."
powershell "Expand-Archive C:path_to_zip_file -Destinationpath C:path_to_to_destination_folder;
$Path = “C:path_to_to_destination_folderfile.xml;”
Select-Xml -XPath '//Report[@finished]').Node.InnerText;
Set-Content -Path 'C:path_to_to_destination_folderresult.txt'
@echo "done"
有人能帮我一下吗?撇开你的问题的偶然方面(似乎从cmd.exe
调用一个破碎的尝试传递多行命令字符串,无效的示例XML,缺乏文件参数到Select-Xml
,缺乏输入到Set-Content
cmdlet):
$path = 'C:path_to_to_destination_folderfile.xml'
(Select-Xml '//Report[@finished]' $path).
Node.Attributes.ForEach({ $_.Name + ' ' + $_.Value }) -join ', ' |
Set-Content C:path_to_to_destination_folderresult.txt
要从cmd.exe
(批处理文件)调用PowerShell代码,需要您要么在单行上传递,要么使用^
,根据本回答中描述的技术,将其小心地扩展到多行上。
@echo off
echo unzipping file...
powershell -c Expand-Archive C:path_to_zip_file -DestinationPath C:path_to_to_destination_folder; ^
$path = 'C:path_to_to_destination_folderfile.xml'; ^
(Select-Xml '//Report[@finished]' $path). ^
Node.Attributes.ForEach({ $_.Name + ' ' + $_.Value }) -join ', ' ^| ^
Set-Content C:path_to_to_destination_folderresult.txt
echo done
如果你需要基础知识方面的帮助,这里有一些PowerShell学习资源:
从学习PowerShell开始。
这个系列的文章,即使它早于PowerShell (Core) 6+,是一个伟大的,以食谱为导向的介绍PowerShell。
http://hyperpolyglot.org/shell将posix兼容的shell(如
bash
)与cmd.exe
和PowerShell的语法以简明的表格形式并列。