我有一个位于远程系统上的脚本。
在服务器“web12”上的 C:\tmp\hgttg.ps1 下:
Write-Host "Don't Panic"
exit 42
Run Code Online (Sandbox Code Playgroud)
我使用 Invoke-Command 从本地机器(两个系统都运行 v4.0)调用此脚本:
$svr = "web12"
$cmd = "C:\tmp\hgttg.ps1"
$result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd}
Run Code Online (Sandbox Code Playgroud)
执行时会产生以下输出:
> $result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd}
Don't Panic
> $result
>
Run Code Online (Sandbox Code Playgroud)
($result未设置,输出直接到控制台,不好!)经过大量的网络搜索和故障排除,我得到了一些改进:
> $result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd; $LASTEXITCODE}
Don't Panic
> $result
42
>
Run Code Online (Sandbox Code Playgroud)
现在我可以捕获返回代码,但输出仍然直接发送到控制台。这是我所能得到的。在我已经尝试过的一长串事情中,以下任何一项都不起作用:
这会产生输出:
> $result
code : 42
output :
PSComputerName : web12 …Run Code Online (Sandbox Code Playgroud) powershell exit-code powershell-remoting powershell-4.0 write-host
对于某人来说,这应该是一个简单的.我只是想不出怎么做.
退出我的程序后,我想隐藏主表单并自行显示最终的"谢谢"表单,如下所示:
procedure TMainForm.ExitExecute(Sender: TObject);
begin
MainForm.Visible := false;
ThankYouForm.Show;
MainForm.Close;
end;
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我得到了例外:
EInvalid操作:无法在OnShow或OnHide中更改Visible
那么如何在退出Delphi中的程序时隐藏主窗体时如何显示最终窗体?
结论:Mghie证实我所尝试的是正确的,应该有效.这表明我在退出和关闭我的表单的程序中的某个地方出现了一个错误.
现在我知道了,找到并解决问题并不需要花很长时间.
发现问题:我正在从ThankYouForm中关闭我的主要表单,并以某种方式回到ExitExecute,并且,它完全被束缚了.
但一切都很好.ThankYouForm.ShowModal之前的MainForm.Hide工作正常.
伙计们,再次感谢
我有一个使用如下命令运行的perl脚本:
/path/to/binary/executable | /path/to/perl/script.pl
Run Code Online (Sandbox Code Playgroud)
该脚本对二进制文件的输出执行有用的操作,然后在STDIN用完后退出(<>返回undef).除非二进制文件以非零代码退出,否则这一切都很好.从脚本的POV开始,它认为脚本刚刚结束,所以它清理并退出,代码为0.
有没有办法让perl脚本看到退出代码是什么?理想情况下,我想要这样的东西工作:
# close STDIN, and if there was an error, exit with that same error.
unless (close STDIN) {
print "error closing STDIN: $! ($?)\n";
exit $?;
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这似乎不起作用:
$ (date; sleep 3; date; exit 1) | /path/to/perl/script.pl /tmp/test.out
Mon Jun 7 14:43:49 PDT 2010
Mon Jun 7 14:43:52 PDT 2010
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
有没有办法让它做我的意思?
编辑添加:
perl脚本实时操作二进制命令的输出,因此将其全部缓冲到文件中是不可行的解决方案.但是,它不需要知道退出代码,直到脚本结束.
我对Linux中的程序退出状态有疑问.在我的程序中,我分叉子进程并调用waitpid以获取它.当waitpid返回时,我想检查我的子进程的退出状态.我转向手动寻求帮助,发现第二个参数waitpid将保持退出状态,我可以使用宏WEXITSTATE来读取它.但是,这个宏只提取实际退出状态的最低有效8位,而在函数手册中exit(int ret_val),它将退出ret_val & 0x377,而不是最低有效8位.
我的问题是,其他更多的位在哪里?我们只是放弃它们吗?为什么Linux采用这种策略?这个实现不会给我们的程序带来麻烦吗?
谢谢和最诚挚的问候.
我正在做一个项目,一切顺利,直到我决定清理我的项目.
仅当我在模拟器上运行我的应用程序时才会出现以下错误(在真实设备上正常运行):
Libtool /Users/Yaman/Library/Developer/Xcode/DerivedData/Homeless-gujyzhsiwenufvedlinbbtrizcpd/Build/Products/Debug-iphonesimulator/libShareKit.a normal i386
cd "/Users/Yaman/Documents/iOS - App à vendre/Homeless/Submodules/ShareKit"
setenv IPHONEOS_DEPLOYMENT_TARGET 4.0
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -static -arch_only i386 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk -L/Users/Yaman/Library/Developer/Xcode/DerivedData/Homeless-gujyzhsiwenufvedlinbbtrizcpd/Build/Products/Debug-iphonesimulator -filelist "/Users/Yaman/Library/Developer/Xcode/DerivedData/Homeless-gujyzhsiwenufvedlinbbtrizcpd/Build/Intermediates/ShareKit.build/Debug-iphonesimulator/Static Library.build/Objects-normal/i386/ShareKit.LinkFileList" -ObjC -all_load -lCopy -lDelicious -lDiigo -lEmail "-lEvernote SDK" -lEvernote -lFacebook "-lFlickr SDK" -lFlickr -lFoursquareV2 "-lGoogle Reader" -lInstagram -lInstapaper -lJSONKit -lKippt -lLinkedIn -lLogout -lOAuth "-lOpen in Safari" -lPinboard -lPrint -lReachability "-lRead It Later" "-lSave to Album" -lShareKitCore "-lSina Weibo" -lSSKeyChain "-lText Message" -lTumblr -lTwitter -lVKontakte -o /Users/Yaman/Library/Developer/Xcode/DerivedData/Homeless-gujyzhsiwenufvedlinbbtrizcpd/Build/Products/Debug-iphonesimulator/libShareKit.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: -dynamic not specified, -all_load invalid …Run Code Online (Sandbox Code Playgroud) 如果我exit在终端中运行命令,那么终端将退出并自行关闭.
如果我运行以下命令,则终端不会自行关闭(请注意exit在if-else命令中使用命令:
#!/bin/bash
a=1
if [ $a -eq 1 ]
then
echo i am true
exit
else
echo i am false
fi
Run Code Online (Sandbox Code Playgroud)
注意:我在上面的代码中使用if-else条件只是为了演示,它与我的问题无关.
如果您认为此问题有问题,请发表评论,请不要评分为-1.
我正在编写一个游戏,其中许多不同的条件可能导致失败,例如图像或着色器无法加载,OpenGL无法获得有效的上下文等.
在理想的世界中,我想以我认为用于C的方式使用退出代码,即对于故障条件非零.但是,有一些因素可以解决这个问题:
atexit()不会被调用,不幸的是,因为我的程序清理是通过单个atexit()注册进行分层处理的main(),我喜欢.在我的情况下,使用非零退出代码可以支持和反对哪些参数?
在Bash中,我想要一个if语句,它基于运行命令的退出代码.例如:
#!/bin/bash
if [ ./success.sh ]; then
echo "First: success!"
else
echo "First: failure!"
fi
if [ ./failure.sh ]; then
echo "Second: success!"
else
echo "Second: failure!"
fi
Run Code Online (Sandbox Code Playgroud)
success.sh
#!/bin/bash
exit 0
Run Code Online (Sandbox Code Playgroud)
failure.sh
#!/bin/bash
exit 1
Run Code Online (Sandbox Code Playgroud)
这应打印出来:
First: success!
Second: failure!
Run Code Online (Sandbox Code Playgroud)
我怎么做到这一点?谢谢!
考虑以下两个C程序:
#include <signal.h>
int main(void) {
raise(SIGTERM);
}
Run Code Online (Sandbox Code Playgroud)
int main(void) {
return 143;
}
Run Code Online (Sandbox Code Playgroud)
如果我运行任何一个,则$?bash中的值将为143。但是,通过waitsyscall可以区分它们:
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGTERM}], 0, NULL) = 11148
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 143}], 0, NULL) = 11214
Run Code Online (Sandbox Code Playgroud)
bash显然使用了这一知识,因为第一个导致将结果Terminated打印到终端上(奇怪的是,即使我将stdout和stderr都重定向到其他地方,也会发生这种情况),而第二个则没有。如何区分这两种情况与bash脚本?
tmp.sh即使发送到命名管道的进程失败,以下玩具脚本()也会以代码0退出.如何从命名管道捕获非零退出代码?或者更一般地说,事情出了问题?
#!/bin/bash
set -eo pipefail
mkfifo mypipe
FOOBAR > mypipe &
cat mypipe
Run Code Online (Sandbox Code Playgroud)
运行并检查退出代码:
bash tmp.sh
tmp.sh: line 6: FOOBAR: command not found
echo $? # <- Exit code is 0 despite the "command not found"!
Run Code Online (Sandbox Code Playgroud)