在Powershell脚本(.ps1)中 从控制台(cmd.exe)命令行启动
如何在控制台中设置和环境变量,
这样,当Powershell脚本结束处理时,
并退出到被调用的控制台...
环境变量存在,
并可以通过批处理文件读取,
或使用SET命令查看?
不想设置“机器”或“用户”变量...
只是一个控制台过程变量...
如果在控制台中使用SET,则会得到相同的变量
答案 0 :(得分:3)
要从public class InsertBatch {
public static void main(String[] args) throws SQLException {
try (Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "root")) {
connection.setAutoCommit(false);
Statement st = connection.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.FETCH_FORWARD
);
System.out.println(new Date());
st.setFetchSize(10000);
System.out.println("start query ");
ResultSet rs = st.executeQuery("SELECT * FROM contratacion");
System.out.println("done query ");
String insert = "INSERT INTO contrato(contrato, codigo_postal,cups) VALUES(?, ?, ?)\n" +
"ON CONFLICT (contrato) DO\n" +
"UPDATE SET codigo_postal = excluded.codigo_postal, cups = excluded.cups";
PreparedStatement pst = connection.prepareStatement(insert);
int cont = 0;
while(rs.next()) {
cont++;
Integer contrato = rs.getInt(1);
Integer codigo_postal = rs.getInt(2);
String cups = rs.getString(3);
pst.setInt(1, contrato);
pst.setInt(2, codigo_postal);
pst.setString(3, cups);
pst.executeUpdate();
connection.commit();
System.out.println(cont);
}
System.out.println(new Date());
} catch (SQLException ex) {
}
}
}
运行PowerShell脚本,始终需要(cmd.exe
/ powershell.exe
)子进程,而子进程基本上是无法为他们的父级进程设置环境变量 [1] 。
您最好的选择是让您的pwsh.exe
文件输出所需环境变量的名称和值,然后调用{ 1}}过程基于该输出。
安全说明:仅当您时,才根据另一个命令(根据您的情况,使用*.ps1
脚本)输出的名称/值对盲目定义环境变量。相信该命令不会输出恶意定义。
这是一个简单示例(直接从交互式cmd.exe
会话运行):
*.ps1
以上内容基于PowerShell命令输出文字名称-值对cmd.exe
的情况,使用值for /f "delims== tokens=1,*" %v in ('powershell.exe -c "'FOO=bar'"') do @set "%v=%w"
定义了环境变量%FOO%
。
使用bar
进行验证。
要将此方法扩展为定义多个环境变量,请使命令在每个行上输出每个定义(在PowerShell中,您可以通过输出字符串数组):
FOO=bar
上面还另外定义了echo %FOO%
和值for /f "delims== tokens=1,*" %v in ('powershell.exe -c "'FOO=bar', 'BAZ=bam'"') do @set "%v=%w"
。
为方便起见,我建议创建一个执行上述操作的包装批处理文件(%BAZ%
):
请注意,您必须在那里使用bam
和*.cmd
而不是%%v
和%%w
。
代替%v
(对于%w
),使用demo命令,将-c
与-Command
文件的路径一起使用来调用它。
-File
来绕过PowerShell环境的*.ps1
文件的加载,这不仅减慢了运行速度,而且还可能污染命令的输出。[1]正如LotPings所指出的,子进程继承了父进程环境变量的副本。父母从未看到过这些副本的修改。子进程从根本上无法修改其父级环境,这是 OS 级别的限制-出于以下原因:通过任意(子级)修改运行进程的环境)过程将是一个严重的安全隐患。