删除所有空格以格式化输出

时间:2019-01-16 10:20:37

标签: powershell

我正在使用Powershell并创建了一个文本文件,该文件会下拉服务器上可用的共享列表。

此文本文件包含许多空格,但是我只需要删除文件夹名称中的空格,例如Test 2$

理想情况下,我只想删除此空间,使其显示为Test2$。当我尝试创建CSV以便可以在其他脚本中使用时。

我复制文本文件并将其重命名为csv,然后复制该CSV的内容,并使用空格作为定界符,然后将结果放入列中,但是当这样做时,它也会占用多个空格,因此清除所有空格,并保留结果,如下所示。

这有可能吗?

所以我尝试了以下方法:

-replace " ",""

$_.trim() -ne

两者都删除所有空白。但是我只需要删除一个即可。

我当前的代码

##############################################################
#Varibles
##############################################################
$PCs = gc "C:\Temp\Servers\Pc.txt"
$FSText = "C:\Temp\Servers\FileShares.txt"
$FSText2 = "C:\Temp\Servers\FileShares2.txt"
$FSERRORS = "C:\Temp\Servers\Errors.txt"
$FSCSV = "C:\Temp\Servers\Server_Shares.csv"
$FSCSV2 = "C:\Temp\Servers\Server_Shares2.csv"
#############################################################

#############################################################
Function Shares{

$PCs|Foreach-Object{ 

Try{
    $ErrorActionPreference = 'Stop'
    $PC = $_
    Get-WmiObject win32_share -ComputerName $_ | Sort-Object -Property path | ft @{Name="Server";Expression={$_.__Server}},path,name

}
  Catch
 { "Unable to obtain to access to shares on $PC " | Out-file $FSERRORS 
   $ErrorActionPreference ='Continue'
}
}
}
#############################################################

Shares | Out-File $FSText

#############################################################
Function Format{
(GC $FSText) -replace "Server", "" -replace "Path","" -replace "Name","" |Set-Content $FSText
(GC $FSText) | ?{$_.trim() -ne ""} |Set-Content $FSText
(GC $FSText) -replace "\s+" , ";"  | Out-File $FSText 


copy-item $FSText $FSText2

Rename-Item $FSText $FSCSV
Rename-Item $FSText2 $FSText
Import-CSV $FSCSV -Delimiter ';' -header Server,Path,Name| Export-CSV $FSCSV2 -NoClobber -NoTypeInformation -Append
}
#############################################################

Format


#############################################################

文本文件中的结果

------    ----            ----   
WKS000001                 IPC$   
WKS000001 C:\             C$     
WKS000001 C:\Temp\Test    Test   
WKS000001 C:\Temp\Test 2$ Test 2$  
WKS000001 C:\WINDOWS      ADMIN$  

------    ----       ----  
WKS000002            IPC$  
WKS000002 C:\        C$    
WKS000002 C:\Windows ADMIN$

csv中的结果

Server          Path                Name
------          ----                ----
WKS000001   IPC$    
WKS000001   C:\             C$
WKS000001   C:\Temp\Test        Test
WKS000001   C:\Temp\Test        2$
WKS000001   C:\WINDOWS      ADMIN$
------          ----                ----
WKS000002   IPC$    
WKS000002   C:\             C$
WKS000002   C:\Windows      ADMIN$

如您所见,它会将Test 2 $的路径分为两列,但是我需要将它放在一列中。

3 个答案:

答案 0 :(得分:2)

您可以只更新计算出的属性,因此替换仅由Name属性使用:

Get-WmiObject win32_share -ComputerName $PC | 
    Select-Object -Property @{Name="Server";Expression={$_.__Server}},Path,@{Name="Name";Expression={$_.Name.replace(" ","")}} | 
    Format-Table -AutoSize

将为您提供输出:

Server    Path            Name
------    ----            ----   
WKS000001                 IPC$   
WKS000001 C:\             C$     
WKS000001 C:\Temp\Test    Test   
WKS000001 C:\Temp\Test 2$ Test2$  
WKS000001 C:\WINDOWS      ADMIN$

答案 1 :(得分:0)

您已经在列中使用了计算所得的属性。对路径使用相同的方式。

Sort-Object -Property path | ft @{Name="Server";Expression={$_.__Server}},@{Name="Path";Expression={$_.Path.replace(" ","")}},Name -autosize

但是您应该知道C:\MyPath!= C:\My Path。要将路径与空格一起使用,请将其括在"'中。 > 'C:\My Path'
要将路径替换为引号中的路径,可以使用以下代码:

Sort-Object -Property path | ft @{Name="Server";Expression={$_.__Server}},@{Name="Path";Expression={"'$_.Path'"}},Name -autosize

Thx James C.指出使用.replace()而不是.trim()。我忘记了.trim()仅适用于字符串开头和结尾的空格,而.replace()则删除了所有空格。

答案 2 :(得分:0)

该问题的解决方案是使用以下内容;

-替换'\ s \ s +'

这将从文本文件中删除所有空格,您可以替换为一个字符并在该相同字符上定界以创建CSV。