Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String PowerShell拆分无法使用字(从文件读取)_String_Powershell_Split - Fatal编程技术网

String PowerShell拆分无法使用字(从文件读取)

String PowerShell拆分无法使用字(从文件读取),string,powershell,split,String,Powershell,Split,我试图从一个文件中提取出现在特定单词模式之间的句子。目的是从文件中提取出现在第一对“GO”单词之间的句子。这里实现的逻辑是基于单词“GO”拆分文件,然后打印数组的第二个元素(本例中以SET开头的句子)。但是,PowerShell无法识别分隔符(GO);相反,它似乎将“新行”识别为分隔符,并打印第二句话 请注意,我需要读取文件,然后完成提取 文件内容 $path = 'D:\Scripts' $deltaFile = 'GoSampleFile.txt' $modifiedDelta = 'GoS

我试图从一个文件中提取出现在特定单词模式之间的句子。目的是从文件中提取出现在第一对“GO”单词之间的句子。这里实现的逻辑是基于单词“GO”拆分文件,然后打印数组的第二个元素(本例中以SET开头的句子)。但是,PowerShell无法识别分隔符(GO);相反,它似乎将“新行”识别为分隔符,并打印第二句话

请注意,我需要读取文件,然后完成提取

文件内容

$path = 'D:\Scripts'
$deltaFile = 'GoSampleFile.txt'
$modifiedDelta = 'GoSampleFile1.txt'

New-Item -path $path -Name $modifiedDelta -ItemType file -Force

#Split for each appearing GO, after escaping the double quotes
(Get-Content $path'\'$deltaFile).replace('"', '`"') | Set-Content  $path'\'$modifiedDelta
$separator = 'GO'
$modifiedDeltaString = Get-Content $path'\'$modifiedDelta

#Write-Host $modifiedDeltaString
#Write-Host $separator

$goArray = $modifiedDeltaString -split "GO", 0, "SimpleMatch"
Write-Output $goArray[1]

#Housekeeping of the temporary file
Remove-Item $path'\'$modifiedDelta
家庭地址“TJ单向”
办公地址“C公司双向”
去
设置ANSI_空值、ANSI_填充、ANSI_警告、ARITHABORT、CONCAT_空值、QUOTED_标识符ON;
将数字_ROUNDABORT设置为OFF;
去
家庭住址“TJ单向”
办公地址“C公司双向”
去
:错误退出时
去
我的代码

$path = 'D:\Scripts'
$deltaFile = 'GoSampleFile.txt'
$modifiedDelta = 'GoSampleFile1.txt'

New-Item -path $path -Name $modifiedDelta -ItemType file -Force

#Split for each appearing GO, after escaping the double quotes
(Get-Content $path'\'$deltaFile).replace('"', '`"') | Set-Content  $path'\'$modifiedDelta
$separator = 'GO'
$modifiedDeltaString = Get-Content $path'\'$modifiedDelta

#Write-Host $modifiedDeltaString
#Write-Host $separator

$goArray = $modifiedDeltaString -split "GO", 0, "SimpleMatch"
Write-Output $goArray[1]

#Housekeeping of the temporary file
Remove-Item $path'\'$modifiedDelta

使用
Get Content-Raw…
将内容读取为一个字符串,而不是每行的字符串数组

可能是一个新的答案,因为还有另一个问题,我将提供更多细节

正如DAX所说,您需要使用
-Raw
,因为Get内容返回一个字符串数组,每行一个。当您在其上使用
-split
时,每个元素都会单独处理

例如,在以下数组上使用时

[0] "Testing"
[1] "This is a test"
[2] "'tis still a test"

$array -split "is", 0, "SimpleMatch"

[0] "Testing"
[1] "Th"
[2] " "
[3] " a test"
[4] "'t"
[5] " still a test"
使用-Raw开关时,Get Content将整个文件作为带有换行符的单个字符串返回

我要指出的另一件事是你在逃避引用,但这不是必要的。您需要转义引号的原因是,PowerShell不会假定您正在终止字符串:

$t = "This is a "bad" test"
> At line:1 char:18
+ $t = "This is a "bad" test"
+                  ~~~~~~~~~~
Unexpected token 'bad" test"' in expression or statement.
Get-Content C:\test.txt
> This is a "bad" test
您需要转义引号,以便“bad”仍然是字符串的一部分

但是,从文件读取时,引号已经是字符串的一部分:

$t = "This is a "bad" test"
> At line:1 char:18
+ $t = "This is a "bad" test"
+                  ~~~~~~~~~~
Unexpected token 'bad" test"' in expression or statement.
Get-Content C:\test.txt
> This is a "bad" test
因为您没有在控制台中键入引号,所以它们不需要转义。要使用自己的代码向您展示,请检查临时文件的完整内容:

Home address `"TJ One way`"
Office address `"C company Two way`"
我想不出你为什么要这么做。也许你因为某种原因想复制并粘贴到控制台中,但仅此而已


这可能暂时还有效,但这只是因为我假设您正在尝试运行的SQL查询不包含引号,虽然我不确定它们是否在SQL中使用,但如果您尝试,它将抛出一个错误,不管怎样,这是一个额外的步骤,您不需要这样做,这样您基本上可以废弃整个临时文件,直接从原始文件中读取。

解释得很好,非常感谢。-Raw参数像魔术一样工作!再次感谢。感谢DAX,在-raw参数的帮助下,文件按预期读取。