小编esc*_*380的帖子

Log4j 2:如何在 Windows 控制台上启用 ANSI 颜色?

我尝试使用Windows 10 命令行在控制台上打印彩色消息,但没有成功。根据Log4j 2 文档,我应该将Jansi jar 添加到我的打印应用程序中,并将属性设置log4j.skipJansifalse在 Windows 上启用 ANSI 支持。请您检查并说出我做错了什么:

  1. 以下代码是我当前的工作:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LoggerTest {
    private static final Logger logger = LogManager.getLogger();

    public static void main(String[] args) throws Exception {
        logger.info("Hello!");
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 以下代码是Log4j 2配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <Properties>
        <Property name="log4j.skipJansi" value="false"/>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout>
                <disableAnsi>false</disableAnsi>
                <Pattern>%style{%d [%t] %c %p: %m}{yellow}%n%ex</Pattern>
            </PatternLayout>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="ConsoleAppender"/>
        </Root>
    </Loggers>

</Configuration> …
Run Code Online (Sandbox Code Playgroud)

java windows console log4j ansi-escape

6
推荐指数
1
解决办法
3869
查看次数

为什么@Transactional 隔离级别在使用 Spring Data JPA 更新实体时不起作用?

对于这个基于spring-boot-starter-data-jpa依赖和H2内存数据库的实验项目,我定义了一个User具有两个字段(idfirstName)的实体,并UsersRepository通过扩展CrudRepository接口声明了一个。

现在,考虑一个简单的控制器,它提供两个端点:/print-user读取同一用户两次,间隔打印其名字,并/update-user用于在两次读取之间更改用户的名字。请注意,我特意设置了Isolation.READ_COMMITTEDlevel 并期望在第一次事务过程中,通过相同 id 检索两次的用户将具有不同的名称。但是相反,第一笔交易打印出两次相同的值。为了更清楚,这是完整的操作序列:

  1. 最初,jeremy的名字设置为Jeremy
  2. 然后我调用/print-userwhich 打印出来Jeremy并进入睡眠状态。
  3. 接下来,我/update-user从另一个会话调用,它将jeremy的名字更改为Bob.
  4. 最后,当第一个事务在睡眠后被唤醒并重新读取jeremy用户时,Jeremy即使名字已经更改为他的名字,它也会再次打印出来Bob(如果我们打开数据库控制台,它现在确实存储为Bob,不是Jeremy)。

似乎在这里设置隔离级别没有任何影响,我很好奇为什么会这样。

@RestController
@RequestMapping
public class UsersController {

    private final UsersRepository usersRepository;

    @Autowired
    public UsersController(UsersRepository usersRepository) {
        this.usersRepository = usersRepository;
    }

    @GetMapping("/print-user")
    @ResponseStatus(HttpStatus.OK)
    @Transactional (isolation = Isolation.READ_COMMITTED) …
Run Code Online (Sandbox Code Playgroud)

java spring spring-transactions spring-data-jpa spring-boot

6
推荐指数
1
解决办法
950
查看次数

cmd / powershell:最小化桌面上除当前命令提示符(控制台)或某些特定窗口之外的所有窗口

好吧,我知道如何使用 powershell 方法 - MinimizeAll() 从批处理文件中最小化桌面上所有打开的窗口:

powershell -command "& { $x = New-Object -ComObject Shell.Application; $x.minimizeall() }"
Run Code Online (Sandbox Code Playgroud)

问题是:此方法最小化了所有内容,包括当前的 cmd 控制台,在我的情况下,该控制台应该对用户始终可见。

现在,为了解决这个问题,我使用外部nircmd.exe工具,我的 .bat 文件的这一部分如下所示:

:: change current command prompt window title
title my-cmd-console

:: minimize all open windows on the desktop with powershell command
powershell -command "& { $x = New-Object -ComObject Shell.Application; $x.minimizeall()  }"

:: bring console back to the front with nircmd.exe command 'win activate [filter window by title]' 
nircmd.exe win activate title "my-cmd-console" 
Run Code Online (Sandbox Code Playgroud)

我不喜欢这段代码的是屏幕上有很多“闪烁”:开始时,控制台出现在桌面上,然后它与所有其他窗口一起最小化,然后再次回到桌面前面。

所以,问题是:如何使控制台出现在桌面前面并“锁定它”,以便在到达命令行 EXIT …

windows powershell cmd batch-file command-prompt

2
推荐指数
1
解决办法
2万
查看次数

cmd:替换文件名的内部部分(使用正则表达式掩码)

我运行一个小的批处理文件来重命名一些 txt 文件:
“C:\backup\t1-dd-dd t2-dd-dd.txt”

在文件名中d - 是一个数字(从 0 到 9);
注意:文件名中 t1 和 t2 标记之间有空格(我出于某种原因需要它)。

现在,我只需要替换文件名的“t1-dd-dd”部分中的数字。

使用 powershell Rename-Item 可以这样做(示例):

powershell -command "& { Get-ChildItem ?:\backup -filter 't1-* t2-*.txt' | Rename-Item -NewName { $_.Name -replace 't1-\d\d-\d\d','t1-00-99' } }"
Run Code Online (Sandbox Code Playgroud)

结果将是这样的:
C:\backup\t1-14-26 t2-56-48.txt(旧文件名)
C:\backup\t1-00-99 t2-56-48.txt(新文件名)

是否可以在没有 powershell 的情况下做同样的事情,只使用 cmd RENAME 命令?

regex windows powershell cmd file-rename

2
推荐指数
1
解决办法
8813
查看次数

在将JDBC驱动程序与MySQL DBMS一起使用时,如何回滚CREATE TABLE和DROP TABLE等DDL语句?

我有一个示例代码,它创建一个表,在其中插入一些行,然后尝试取消整个事务,但是conn.rollback()似乎只对INSERT语句有效,而CREATE TABLE却不受影响:新创建的表在数据库中保持永久不变,没有插入任何行。

将JDBC驱动程序与MySQL DBMS一起使用时,这是标准行为吗?

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TestBatch {
    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC",
                "root", "root")) {

            // drop table
            try (Statement dropStatement = conn.createStatement()) {
                dropStatement.executeUpdate("DROP TABLE IF EXISTS mytable");
            }

            // create table, insert rows and rollback
            conn.setAutoCommit(false);
            try (Statement stmt = conn.createStatement()) {
                stmt.addBatch("CREATE TABLE mytable (id INT)");
                stmt.addBatch("INSERT INTO mytable VALUES (1)");
                stmt.addBatch("INSERT INTO mytable VALUES (2)");
                stmt.executeBatch();
                conn.rollback();
            } …
Run Code Online (Sandbox Code Playgroud)

java mysql jdbc rollback

1
推荐指数
1
解决办法
69
查看次数