배치 파일 내에서 PowerShell 스크립트를 실행하고 있습니다. 스크립트는 웹 페이지를 가져 와서 페이지 내용이 “OK”문자열인지 확인합니다.
PowerShell 스크립트는 오류 수준을 배치 스크립트로 반환합니다.
배치 스크립트는 FTP 자동화 프로그램 인 ScriptFTP 에 의해 실행됩니다 . 오류가 발생하면 ScriptFTP가 전자 메일을 통해 전체 콘솔 출력을 관리자에게 보내도록 할 수 있습니다.
PowerShell 스크립트에서 “OK”가 아닌 경우 웹 사이트에서 반환 값을 출력하고 싶습니다. 따라서 오류 메시지가 콘솔 출력과 상태 메일에 포함됩니다.
PowerShell을 처음 사용하고 어떤 출력 함수를 사용할지 잘 모르겠습니다. 세 가지를 볼 수 있습니다.
- 쓰기 호스트
- 쓰기 출력
- 쓰기 오류
Windows에 해당하는 내용을 쓰는 데 올바른 것은 무엇입니까 stdout
?
답변
단순히 무언가를 출력하는 것은 PowerShell이 아름다움의 하나이며 가장 큰 장점 중 하나입니다. 예를 들어, 일반적인 Hello, World! 응용 프로그램이 한 줄로 줄어 듭니다.
"Hello, World!"
문자열 객체를 생성하고 위에서 언급 한 값을 할당하며 명령 파이프 라인의 마지막 항목으로 .toString()
메소드를 호출 하고 결과를 STDOUT
(기본적으로) 출력합니다 . 아름다움의 것.
다른 Write-*
명령은 텍스트를 관련 스트림으로 출력하는 것과 관련이 있으며 그와 같은 위치에 있습니다.
답변
이 경우 Write-Output 이 필요하다고 생각 합니다.
당신이 같은 스크립트를 가지고 있다면
Write-Output "test1";
Write-Host "test2";
"test3";
그런 다음 리디렉션 된 출력으로 스크립트를 호출하면 yourscript.ps1 > out.txt
, 당신은 얻을 것이다 test2
화면 test1\ntest3\n
은 “out.txt”이다.
“test3″및 Write-Output 행은 항상 텍스트에 새 행을 추가하며 PowerShell에서이를 중지 할 수있는 방법이 없습니다 (즉 echo -n
, 기본 명령을 사용하는 PowerShell에서는 불가능 함). 당신이 ( Bash 에서 다소 기본적이고 쉬운 ) 기능 을 원한다면echo -n
원한다면 samthebest의 답변 을 참조하십시오 .
배치 파일이 PowerShell 명령을 실행하면 대부분 Write-Output 명령을 캡처합니다. 시스템 관리자와 콘솔에 무엇을 써야하는지, 무엇을해서는 안되는지에 대해 “긴 토론”을했습니다. 우리는 이제 스크립트가 성공적으로 실행되거나 사망 한 경우에만 정보를 Write-Host
가져와야하며 스크립트 작성자가 수행 한 모든 항목이 실행 (업데이트 된 항목, 설정된 필드 등)에 대해 알아야 할 것에 동의했습니다. 쓰기 출력. 이 방법으로 시스템 관리자에게 스크립트를 제출 runthescript.ps1 >someredirectedoutput.txt
하면 모든 것이 정상이면 화면에서 쉽게 볼 수 있습니다 . 그런 다음 “someredirectedoutput.txt”를 개발자에게 다시 보내십시오.
답변
다음은 Echo와 Write-Host 의 좋은 전시회라고 생각합니다 . test ()가 실제로 하나의 int가 아닌 int의 배열을 실제로 반환하는 방법에 주목하십시오.
function test {
Write-Host 123
echo 456 # AKA 'Write-Output'
return 789
}
$x = test
Write-Host "x of type '$($x.GetType().name)' = $x"
Write-Host "`$x[0] = $($x[0])"
Write-Host "`$x[1] = $($x[1])"
위의 터미널 출력 :
123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789
답변
기본 스트림 (출력 및 오류)에 쓰므로 시나리오에서이 중 하나를 사용할 수 있습니다. 출력을 다른 커맨드 렛으로 파이프하는 경우 Write-Output 을 사용하려고합니다. Write-Output 은 결국 Write-Host 에서 종료됩니다 .
이 문서에서는 다양한 출력 옵션에 대해 설명합니다. PowerShell O는 출력용입니다.
답변
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta
마젠타는 “System.ConsoleColor”열거 자 값 중 하나 일 수 있습니다 (검정, 진한 파랑, 진한 녹색, 진한 청록, 진한 빨강, 진한 마젠타, 진한 노랑, 회색, 진회색, 파랑, 녹색, 청록, 빨강, 자홍, 노랑, 흰색).
는 + $File.FullName
선택 사항이며, 쇼는 어떻게 문자열로 변수를 넣어.
답변
PowerShell을 사용하여 성가신 개행을 생략 할 수는 없습니다. 이를 수행하는 스크립트 또는 cmdlet이 없습니다.
물론 Write-Host는 리다이렉트 / 파이프 할 수 없기 때문에 절대적으로 넌센스입니다! 당신은 단순히 자신의 것을 작성해야합니다 :
using System;
namespace WriteToStdout
{
class Program
{
static void Main(string[] args)
{
if (args != null)
{
Console.Write(string.Join(" ", args));
}
}
}
}
예 :
PS C:\> writetostdout finally I can write to stdout like echo -n
finally I can write to stdout like echo -nPS C:\>
답변
Windows 표준 stdout에 쓰는 데 올바른 방법은 무엇입니까?
에 효과가 있지만, 매우 불행하게도 , 모두 의 Windows PowerShell 및 PowerShell을 코어 7.0의로 보내 모두 자신의 6 (!)의 출력 스트림 에 표준 출력을 할 때 호출 외부에서 PowerShell을의를 통해, CLI .
-
이전 버전과의 호환성을 위해 수정되지 않는이 문제가있는 동작에 대한 설명은 이 GitHub 문제 를 참조하십시오 .
-
실제로 이것은 출력을 보내는 PowerShell 스트림이 외부 호출자의 stdout 출력 으로 표시됨을 의미 합니다.
-
예를 들어에서 다음을 실행하면 stdout 리디렉션 이 모든 PowerShell 스트림에 동일하게 적용 되므로 출력
cmd.exe
이 표시 되지 않습니다NUL
.C:\>powershell -noprofile -command "Write-Error error!" >NUL
-
그러나 – 호기심 – 당신이 경우 표준 오류 리디렉션 , PowerShell을 하지 stderr에 자사의 에러 스트림을 보내 , 그래서 그와
2>
당신이 할 수 오류 스트림 출력을 선택적으로 캡처; 다만 다음 출력'hi'
– 성공 스트림 출력 – 파일 에러 스트림 출력을 캡처하는 동안err.txt
:C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt
-
바람직한 행동 입니다 :
- PowerShell의 성공 출력 스트림 (number
1
)을 stdout으로 보냅니다 . -
출력을 전송 하는 모든 다른 스트림 에 열려진 주어진 유일한 옵션이며, 사이 프로세스 만 이 출력 스트림이 존재 – 표준 출력 (표준 출력)을위한 데이터 및 오류 메시지를 표준 에러 (표준 오차) 및 그 외의 모든 메시지를 – 예 데이터 가 아닌 상태 정보로 .
-
현재 존중되지 않더라도 코드에서 이러한 차이를 만드는 것이 좋습니다 .
내부 PowerShell :
-
Write-Host
인 에 대한 표시 출력 과 바이 패스 성공 출력 스트림 – 같은 출력은 둘 (직접) 가변 캡처도 억제도 리디렉션 될 수 없다.-
원래 의도는 단순히 사용자 피드백을 작성하고 간단한 콘솔 기반 사용자 인터페이스 (컬러 출력)를 작성하는 것이 었습니다.
-
인해 포획 또는 리디렉션 종래 무능력 PowerShell을 만든 버전 (5)에
Write-Host
새롭게 도입로 정보 스트림 (번호6
), 그럼 이래로 인 캡처 및 리디렉션 가능한Write-Host
출력.
-
-
Write-Error
비 종료 오류를 오류 스트림 (number ) 에 기록 하기위한 것입니다2
. 개념적으로 오류 스트림은 stderr과 같습니다. -
Write-Output
성공 [출력] 스트림 (number1
)에 씁니다 . 이는 개념적으로 stdout과 같습니다. 그것은 인 기록 스트림에 데이터 행 (결과).- 그러나 PowerShell의 암시 적 출력 기능 으로 인해 명시적인 사용
Write-Output
이 거의 필요하지 않습니다. .- 명시 적으로 캡처, 억제 또는 경로 재 지정되지 않은 명령 또는 표현식의 출력은 자동으로 성공 스트림 으로 전송됩니다 . 예를 들어,
Write-Output "Honey, I'm $HOME"
및"Honey, I'm $HOME"
도 빠르게 후자뿐만 아니라 것보다 간결와 동일하지만.
- 명시 적으로 캡처, 억제 또는 경로 재 지정되지 않은 명령 또는 표현식의 출력은 자동으로 성공 스트림 으로 전송됩니다 . 예를 들어,
- 그러나 PowerShell의 암시 적 출력 기능 으로 인해 명시적인 사용