gpt4 book ai didi

powershell - 批处理文件中的powershell

转载 作者:行者123 更新时间:2023-12-03 00:19:35 24 4
gpt4 key购买 nike

我正在尝试创建一个包含powershell的批处理脚本,但是它不起作用,如下所示

@echo off
rename D:\temp\*.csv temp.csv
powershell.exe -Command "& {Import-Csv D:\temp\temp.csv | select ip,hostname | Export-Csv -Path D:\temp\temp01.csv –NoTypeInformation}"
del /F /S /Q D:\temp\temp.csv
powershell -command "& {Rename-Item D:\temp\temp01.csv D:\temp\temp.txt}"
type D:\temp\temp.txt | findstr /v n/s | findstr /v n/a | findstr /v Hostname >> D:\temp\temp01.txt
del /F /S /Q D:\temp\temp.txt
rename D:\temp\temp01.txt temp.txt
powershell -command "& {Rename-Item D:\temp\temp.txt dad.csv}"
powershell -command "& {Get-Content D:\temp\dad.csv | where {$_ -match 'LWKS'} | Set-Content D:\temp\lwks.csv}"
powershell -command "& {Get-Content D:\temp\dad.csv | where {$_ -match 'WKS'} | Set-Content D:\temp\wks.csv}"
exit

但是,如果我确实使用cmd从上述批处理脚本中运行了单独的命令,则效果很好。
可以在 here中找到temp.csv
谢谢你的帮助。

最佳答案

好的,您原来的脚本效率低下,设计欠佳。这是执行所需操作的功能,不需要临时文件。通常,我不会收到太多评论,但是我想确保每个人都明白我的所作所为。输出文件将位于执行此方法的工作目录中。

用法(在cmd / batch中):powershell -command“&{。\ FileContainsThisFunction.ps1; Extract-Hosts original.csv}”

用法(在Powershell中):。 \ FileContainsThisFunction.ps1;提取主机original.csv

function Extract-Hosts {
param(
[Parameter(Mandatory=$true)]
[String]$InputFile
)

if(-not (Test-Path $InputFile)) { throw ("Input file doesn't exist: {0}" -f $InputFile) }

# Extract filename without path or extension
$BaseName = Get-Item $InputFile | Select -ExpandProperty Basename

# Create a custom object that conains the outfilename and the content for lwks and wks
$OutLwks = @{ File = ('{0}-lwks.csv' -f $Basename); Content = @() }
$OutWks = @{ File = ('{0}-wks.csv' -f $Basename); Content = @() }

# First, delete the output files if they exist
$OutLwks, $OutWks | ForEach { if (Test-Path -Path:($_.File)) { Remove-Item $_.File } }

# Import the original csv into the pipeline
Import-Csv $InputFile |
# We only care about the IP and Hostname columns
Select -Property IP, Hostname |
# Where the hostname is not empty, nor contains n/a or n/s
Where { $_.Hostname -iNotMatch '(^$|n/a|n/s)' } |
ForEach-Object {
# If it contains lwks, add it to that list
if ($_ -imatch 'lwks') {
($OutLwks.Content += $_)
}
# if it contains wks but NOT lwks, add to the other list
elseif ($_ -imatch 'wks') {
($OutWks.Content += $_)
}
} | Out-Null # Sends objects to null after pipeline processing.

# Splat each one into the appropriate CSV file
$OutLwks, $OutWks | ForEach-Object {
$_.Content | Export-Csv -Path $_.File -NoTypeInformation }
}

编辑:修正了第二次添加内容时的错字,它应该已读取OutWks.Content + = $ _
编辑+:用Foreach替换了Where magic,使其更易于理解;添加了Out-Null以抑制流水线之后的输出。

希望该脚本将使您比在Powershell中编写丰富的管道处理器更近一步。

关于powershell - 批处理文件中的powershell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17589916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com