Powershell环境变量

时间:2019-06-08 21:26:57

标签: powershell variables environment

在Powershell脚本(.ps1)中 从控制台(cmd.exe)命令行启动

如何在控制台中设置和环境变量,
这样,当Powershell脚本结束处理时,
并退出到被调用的控制台...
环境变量存在,
并可以通过批处理文件读取,
或使用SET命令查看?

不想设置“机器”或“用户”变量...
只是一个控制台过程变量...
如果在控制台中使用SET,则会得到相同的变量

1 个答案:

答案 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 级别的限制-出于以下原因:通过任意(子级)修改运行进程的环境)过程将是一个严重的安全隐患。