![배치 파일의 Powershell 명령: "foo" 및 "bar"가 있는 줄을 제외하고 텍스트 파일에서 모든 줄을 제거하시겠습니까?](https://rvso.com/image/1654781/%EB%B0%B0%EC%B9%98%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20Powershell%20%EB%AA%85%EB%A0%B9%3A%20%22foo%22%20%EB%B0%8F%20%22bar%22%EA%B0%80%20%EC%9E%88%EB%8A%94%20%EC%A4%84%EC%9D%84%20%EC%A0%9C%EC%99%B8%ED%95%98%EA%B3%A0%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%AA%A8%EB%93%A0%20%EC%A4%84%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
다음 3줄의 텍스트 파일이 있습니다.
This line contains foo.
This line contains bar.
This line has neither.
".bat" 파일(위의 ".txt" 파일 옆)에서 아래 명령을 실행할 수 있으며 "foo"가 포함된 줄을 제외하고 텍스트 파일의 모든 줄이 제거됩니다.
Powershell.exe -Command "gci *.txt | foreach { (cat $_.FullName | ? { $_ -like '*foo*' }) | set-content $_.FullName}"
의도한 효과가 있는 실행을 실행하면 텍스트 파일에 다음 줄만 남깁니다.
This line contains foo.
이제 문제는: "foo"가 있는 줄을 유지하려면 어떻게 해야 합니까?그리고줄에 "바"가 있습니까?
파이프 문자 넣기, *foo*|*bar*
별표 빼기 foo|bar
, 시작과 끝 부분에만 별표 넣기: *foo|bar*
, 쉼표 사용, 쉼표 사용 안 함, 세미콜론 사용, 세미콜론을 사용하지 않고 다른 여러 가지 방법 -like
으로 명령을 복제합니다.$_
아무것도 작동하지 않습니다. 지금까지 모든 시도에서 foo(라인 1), bar(라인 2) 및 둘 다(라인 3)가 포함되지 않은 원래 세 줄로 구성된 텍스트 파일이 동일하게 표시되었습니다.
명령을 편집하고 오류가 발생하지 않도록 주기적으로 편집 내용을 제거하고 명령을 다시 실행하여 줄에 "foo"가 없는 줄을 꺼내면 작동합니다. 또는 명령을 다시 붙여넣습니다. 다시 테스트한 다음 "bar"를 포함하도록 편집해 보십시오. 소용이 없습니다.
최근에 이미 이 질문을 했는데 제목의 표현이 명확하지 않은 것 같습니다. 누군가 답변을 시도했지만 그들이 제공한 모든 답변이 작동하지 않았습니다. 적어도 명령을 배치 파일에 넣고 텍스트 파일 옆에서 실행할 때 다른 방법을 사용하여 작동할 수도 있습니다. 나는 그런 사람인지 모르겠습니다.
배치 파일에서 powershell 명령을 사용하고 있습니다.콘솔에 입력하거나 ps1 스크립트를 사용하지 않습니다. 그 중 어떤 것도 할 필요가 없습니다. 위에서 언급한 첫 번째 명령이작동합니까"foo"가 포함된 모든 줄을 제거합니다.
분명히 이것이 작동하기 때문에 명령을 추가할 기초로 사용할 수 있으므로 하나의 명령에서 "foo"와 "bar"를 처리할 수 있습니다.
물론 이것이 100% 불가능하지 않는 한(현재 약 4일 동안 명령에 대해 40~50가지 다양한 변형을 시도한 후) 이것이 제가 의심하기 시작한 것입니다!
누구든지 이 질문에 답하면 위와 같이 배치 파일 명령을 게시해 주세요. ps1 스크립트를 사용하도록 바꾸거나 콘솔 창에 무엇을 입력해야 하는지 설명하는 답변을 제공하지 마십시오.
위에 게시한 명령에는 "bar"를 "foo"에 추가하여 둘 이상의 텍스트 문자열을 처리할 수 있도록 일종의 수정이 필요합니다.
이것이 그렇게 어려운 이유는 "foo"가 있는 줄을 제외한 모든 줄을 제거하는 명령을 실행하면 이미 "bar"가 있는 줄을 제거했기 때문인 것 같습니다. 나는 이것이 아직 아무도 제대로 작동하는 해결책을 찾지 못한 이유라고 생각하며 아마도 해결책이 없을 수도 있습니다.
답변이 있는 분들께 미리 감사드립니다. 일반적으로 이런 것들은 여기에서 매우 빠르게 답변되거나 계속해서 다른 방법을 시도하여 작동하게 됩니다. 하지만 이번에는 아닙니다. 어떤 이유에서인지 정말 힘든 문제입니다.
답변1
OR과 결합된 두 가지 별도의 조건을 사용하세요.
cat $_.FullName | ? { $_ -like '*foo*' -or $_ -like '*bar*' }
명확성을 추가하기 위해 괄호를 사용할 수 있지만 선택 사항입니다.
{ ($_ -like '*foo*') -or ($_ -like '*bar*') }
위와 같이 배치 파일 명령을 게시하십시오. ps1 스크립트를 사용하도록 바꾸거나 콘솔 창에 무엇을 입력해야 하는지 설명하는 답변을 제공하지 마십시오.
그것들은 말 그대로 같은 것입니다. PowerShell 스크립트를 호출하는 방법은 중요하지 않습니다. 파일에 저장되었거나 명령줄을 통해 전달되었거나 키보드로 입력되었는지 여부는 여전히 PowerShell 스크립트이며 동일한 구문 규칙을 따릅니다.
답변2
select-string
대신 정규 표현식을 사용하는 것을 사용할 수 있습니다 .
gci *.txt | % { (cat $_.FullName | select-string -pattern 'foo|bar') | set-content $_.FullName -Force }
select-string
필요한 경우 앞으로 더 복잡한 정규식 일치를 수행할 수 있습니다.